1

我有很多表并执行大查询(大约 5-7 个左连接)。看起来像这样

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 次) 。

我做错了什么?

附言

我不能使用 DISTINCT,因为一个字段是 section_id 而另一个字段是 note。注意可能相似,但 section_id 是唯一的。

聚苯乙烯

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)
4

2 回答 2

5

tablefields当您在和中都有多个匹配的行时tableothers,您将获得这些行的叉积。(我相信这是马库斯亚当斯在他的评论中得到的。)

如果您想要每个表中的“列表”,而不生成任何“重复”,请尝试以下操作:

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

别名为 as 的内联视图为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

这种方法允许生成叉积,但随后消除了所有重复项,包括由“叉积”操作生成的重复值以及存在于本机数据中的那些重复项。

于 2012-07-12T14:39:12.340 回答
-2

这是因为 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
于 2012-07-12T13:09:04.527 回答