Проблема GROUP_CONCAT и LEFT_JOIN - возвращены не все строки - PullRequest
2 голосов
/ 31 октября 2009

Допустим, моя схема БД выглядит следующим образом:

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 создать линию для этого продукта, даже если есть LEFT JOIN .

  1. Это ожидаемое поведение MySQL?
  2. Можно ли как-нибудь получить ожидаемый результат, используя GROUP_CONCAT или другую функцию?

Ответы [ 2 ]

6 голосов
/ 31 октября 2009

Ах, нашел мой ответ:

Никогда не забывайте предложение GROUP BY при работе с GROUP_CONCAT . Я пропустил GROUP BY T_PRODUCT.id_product во втором запросе.

Я оставлю вопрос в том случае, если кто-то так же рассеян, как и я.

Редактировать :

Из этого ответа я решил, что можно также активировать режим SQL ONLY_FULL_GROUP_BY, чтобы заставить MySQL выдавать ошибку в случае, если GROUP BY отсутствует или неверен.

0 голосов
/ 31 октября 2009

Кроме того, вы можете использовать подзапрос, просто проверить производительность

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
...