簡體   English   中英

GROUP_CONCAT返回多條記錄

[英]GROUP_CONCAT return multiple records

我有很多表並執行大查詢(大約5-7 LEFT JOIN)。 看起來像這樣

SELECT *, t.id
GROUP_CONCAT(field SEPARATOR '|') AS fields,
GROUP_CONCAT(other SEPARATOR '|') AS others
FROM table t
LEFT JOIN tablefields tf ON t.id = tf.user_id
LEFT JOIN tableothers to ON t.id = to.user_id
GROUP BY t.id

這是問題所在。 所有字段都很好,但是兩個就像'value | value | value | value'(15-17次),即使連接表中只有一行。

我做錯了什么?

PS

我不能使用DISTINCT,因為一個字段是section_id而其他字段是note。 注意可能類似,但section_id是唯一的。

PPS

https://gist.github.com/3098105

查看查詢結果的一部分。

mysql> SELECT * FROM tablename;
+----+---------+------------+-----------+
| id | user_id | section_id | note_data |
+----+---------+------------+-----------+
|  1 |    1331 | UserVideo  | test      |
|  2 |    1331 | UserNCAA   | test      |
+----+---------+------------+-----------+
2 rows in set (0.00 sec)

如果在tablefieldstableothers有多個匹配的行,則會得到行的叉積。 (我相信馬庫斯亞當斯在評論中得到了什么。)

如果您想要每個表中的“列表”,而不生成任何“重復”,請嘗試以下方法:

SELECT tt.id
     , tt.fields
     , GROUP_CONCAT(to.other ORDER BY to.other SEPARATOR '|') AS `others`
  FROM (SELECT t.id
             , GROUP_CONCAT(tf.field ORDER BY tf.field SEPARATOR '|') AS `fields`
          FROM table t
          LEFT JOIN tablefields `tf` ON t.id = tf.user_id
         GROUP BY t.id
       ) tt
  LEFT JOIN tableothers `to` ON tt.id = to.user_id
 GROUP BY tt.id, tt.fields

內聯視圖別名為tt讓你從列表中tablefields ,在同一行上每個t.id 然后可以將該結果集連接到tableothers表,以從該表中獲取列表。 以這種方式生成結果集可避免在每個表中存在多個匹配行時生成額外的重復項,否則對於交叉產品而言。


您注意到您無法使用DISTINCT關鍵字,因為您希望保留每個列表中的重復值。 如果這不是必需的,如果您可以允許消除重復值,那么您使用DISTINCT關鍵字來獲得幾乎相同的結果:

SELECT t.id
     , GROUP_CONCAT(DISTINCT tf.field ORDER BY tf.field SEPARATOR '|') AS `fields`
     , GROUP_CONCAT(DISTINCT to.other ORDER BY to.other SEPARATOR '|') AS `others`
  FROM table t
  LEFT JOIN tablefields `tf` ON t.id = tf.user_id
  LEFT JOIN tableothers `to` ON t.id = to.user_id
 GROUP BY t.id

此方法允許生成交叉產品,但隨后消除所有重復項,即“交叉產品”操作生成的重復值,以及本機數據中存在的重復值。

這是因為t。*。 您應該只選擇要應用分組的列。 就像是

SELECT t.id, 
GROUP_CONCAT(field SEPARATOR '|') AS fields, 
GROUP_CONCAT(other SEPARATOR '|') AS others 
FROM table t 
LEFT JOIN tablefields tf ON t.id = tf.user_id 
LEFT JOIN tableothers to ON t.id = to.user_id 
GROUP BY t1.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM