让我们说我的数据库方案如下:

T_PRODUCT
id_product (int, primary)

two entries: (id_product =1) , (id_product =2)

T_USER
id_user (int, primary)
id_product (int, foreign key)
name_user (varchar)

two entries: (id_product=1,name_user='John') , (id_product=1,name_user='Mike')

如果我运行了第一个查询来获得的所有产品与用户(如果有任何),我得到这个:

SELECT T_PRODUCT.id_product, T_USER.name_user 
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;

>>
id_product name_user
1          John
1          Mike
2          NULL

看起来对我很好。现在如果我想同样的事情,除了我想有一个产品每线,连接的用户名称(如果有任何用户,否则NULL):

SELECT T_PRODUCT.id_product, GROUP_CONCAT(T_USER.name_user) 
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;

>>
id_product name_user
1          John,Mike

**expected output**:
id_product name_user
1          John,Mike
2          NULL

如果没有用户的产品,GROUP_CONCAT防止mysql从生产线用于这个产品,即使有一个 左边加入.

  1. 这是一个预期MySQL行为?
  2. 是否有任何种方式我可以得到预期的产出,使用GROUP_CONCAT或另一种功能?
有帮助吗?

解决方案

啊,找到我的回答:

你应该永远不会忘记的 小组通过 条款工作时 GROUP_CONCAT.我失踪 GROUP BY T_PRODUCT.id_product 在我的第二个查询。

我会留下的问题的情况下,有人因为心不在焉,因为我。

编辑:

这个答案, 我想我还可以激活SQL模式 ONLY_FULL_GROUP_BY 迫MySQL扔一个错误的情况下组由是缺失的或不正确的。

其他提示

或者,也可以使用一个子查询的,只是测试性能

SELECT 
  T_PRODUCT.id_product, 
  (SELECT GROUP_CONCAT(T_USER.name_user) 
     FROM T_USER 
     WHERE T_USER.id_product = T_PRODUCT.id_product
  )
FROM T_PRODUCT
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top