mysql群組 - sql group by concat mysql




我可以將多個MySQL行連接成一個字段嗎? (6)

使用MySQL ,我可以執行如下操作:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

我的輸出:

shopping
fishing
coding

但我只想要1行,1列:

預期產出:

shopping, fishing, coding

原因是我從多個表中選擇多個值,並且在所有連接之後,我得到的行數比我想要的多得多。

我在MySQL Doc中尋找了一個函數,它看起來不像CONCATCONCAT_WS函數接受結果集,所以這裡的任何人都知道如何做到這一點?


用於連接多個單獨行的替代語法

警告:這篇文章會讓你感到飢餓。

鑑於:

我發現自己想要選擇多個單獨的行 - 而不是一個組 - 並在某個字段上進行連接。

假設您有一張產品ID及其名稱和價格表:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

然後你有一些花哨的schmacy ajax,把這些小狗列為複選框。

你的飢餓的河馬用戶選擇13,15,16。 今天沒有甜點給她...

找:

使用純粹的mysql在一行中總結用戶訂單的一種方法。

解:

使用GROUP_CONCATIN子句

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

哪些輸出:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

獎勵解決方案:

如果你想要總價格,可以折騰SUM()

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

PS:如果您附近沒有In-N Out,請致歉...


你可以使用GROUP_CONCAT

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

正如路德維格在評論中所述,您可以添加DISTINCT運算符以避免重複:

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

正如Jan在她/他的評論中所述,您還可以在使用ORDER BY破壞它之前對值進行排序:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

正如Dag在他的評論中所述,結果有1024字節的限制。 要解決此問題,請在查詢之前運行此查詢:

SET group_concat_max_len = 2048

當然,你可以根據你的需要更改2048 。 計算並分配值:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies GROUP BY person_id)
    AS UNSIGNED
)

嘗試這個:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

在我的情況下,我有一排Ids,需要將它轉換為char,否則結果會被編碼為二進制格式:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

您可以通過設置group_concat_max_len參數來更改GROUP_CONCAT值的最大長度。

請參閱GROUP_CONCAT詳細信息。


我有一個更複雜的查詢,並發現我必須在外部查詢中使用GROUP_CONCAT才能使其工作:

原始查詢:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

崩盤:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

希望這可能有助於某人。





group-concat