MySQL JOIN / GROUP_CONCAT вторая таблица? - PullRequest
4 голосов
/ 01 марта 2010

Итак, у меня есть этот запрос, который отлично работает:

SELECT users.*,
GROUP_CONCAT(categories.category_name) AS categories
FROM users
LEFT OUTER JOIN user_categories ON users.user_id = user_categories.user_id
LEFT OUTER JOIN categories ON user_categories.category_id = categories.category_id
WHERE users.user_city = 'brooklyn'
GROUP BY users.user_id
LIMIT 10;

Скажем, у меня есть другая таблица, в которой хранятся телефонные номера, для "пользователей" у пользователя может быть любое количество телефонных номеров ... Как бы я поступил так же, как и с категориями? Другими словами, я хотел бы получить другой столбец со ВСЕМИ номерами phone_numbers, найденными в таблице «phones », которые имеют одинаковый« user_id », и объединить их вместе (phone1, phone2, phone3)? Я пробовал:

SELECT users.*,
GROUP_CONCAT(phones.phone_number) AS phone_numbers,
GROUP_CONCAT(categories.category_name) AS categories
FROM users
LEFT OUTER JOIN phones ON users.user_id = phones.user_id
LEFT OUTER JOIN user_categories ON users.user_id = user_categories.user_id
LEFT OUTER JOIN categories ON user_categories.category_id = categories.category_id
WHERE users.user_city = 'brooklyn'
GROUP BY users.user_id
LIMIT 10;

Без везения ... или, по крайней мере, запрос выполняется, но он делает некоторые странные вещи дублирования ... любая помощь будет потрясающей!

Спасибо!

Ответы [ 2 ]

6 голосов
/ 01 марта 2010

Это делает странные вещи, потому что есть перекрестное произведение определенных строк. Вы можете использовать ключевое слово DISTINCT для получения только уникальных телефонных номеров:

GROUP_CONCAT(DISTINCT phones.phone_number) AS phone_numbers,

Проверьте документацию . Кроме того, вы можете получить телефонные номера в другом запросе, где вы бы выбрали только телефонные номера с условием типа WHERE phones.user_id IN (x, x, x, ...) (x - идентификаторы, возвращенные из первого запроса).

3 голосов
/ 23 января 2013

Это случилось со мной, мне позже пришлось изменить свой запрос на это.

SELECT 
   ( SELECT GROUP_CONCAT(`partnumber`) FROM `product_partnumber` AS `n` WHERE `p`.`id`=`n`.`product_id`) as `partnumbers`,
   ( SELECT GROUP_CONCAT(`oem`) FROM `product_oem` AS `n` WHERE `p`.`id`=`n`.`product_id`) as `oems`
FROM `product` AS `p`

Так что мне пришлось использовать подзапросы, иначе у меня было дублирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...