我有许多表,并执行大查询(大约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’(15-17次),即使在going表中只有一行。
我做错了什么?
附注:
我不能使用DISTINCT,因为一个字段是section_id,另一个字段是note。注可能类似,但section_id是唯一的。
P.P.S
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)发布于 2012-07-12 14:39:12
当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这个内联视图别名为tt,它为每个t.id在一行上从tablefields获得列表。然后,可以将该结果集连接到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-12 13:09:04
这是因为。*。只应选择要为其应用分组的列。有点像
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.idhttps://stackoverflow.com/questions/11452476
复制相似问题