首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GROUP_CONCAT返回多条记录

GROUP_CONCAT返回多条记录
EN

Stack Overflow用户
提问于 2012-07-12 13:05:17
回答 2查看 3.8K关注 0票数 1

我有许多表,并执行大查询(大约5-7左联接)。看上去像这样

代码语言:javascript
运行
复制
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

查看部分查询结果。

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2012-07-12 14:39:12

tablefieldstableothers中有多个匹配行时,您将得到行的交叉乘积。(我相信马库斯·亚当斯在他的评论中就是这么说的。)

如果您希望从每个表中获得“列表”,而不生成任何“副本”,请尝试如下所示:

代码语言:javascript
运行
复制
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关键字来获得几乎相同的结果:

代码语言:javascript
运行
复制
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

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

票数 5
EN

Stack Overflow用户

发布于 2012-07-12 13:09:04

这是因为。*。只应选择要为其应用分组的列。有点像

代码语言:javascript
运行
复制
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
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11452476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档