2013-09-14 3 views
1

Я анализирую несколько запросов и заметил некоторые интересные результаты при попытке извлечь несколько полей из разных таблиц на основе user_id. Рассмотрим следующие таблицы:select group_concat vs group_concat слева присоединиться

+------------------------+------------------+------+-----+---------+----------------+ 
| Field     | Type    | Null | Key | Default | Extra   | 
+------------------------+------------------+------+-----+---------+----------------+ 
| subscription_id  | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| user_id    | int(11) unsigned | YES | MUL | NULL |    | 
| expires    | int(11) unsigned | YES | MUL | NULL |    | 
| created    | int(11) unsigned | YES | MUL | NULL |    | 
| modified    | int(11)   | YES |  | NULL |    | 
+------------------------+------------------+------+-----+---------+----------------+ 

Я хочу GROUP_CONCAT всех подписок пользователя при получении данных о пользователях. В настоящее время этот метод работает для одного поля:

SELECT u.id, 
(
    SELECT GROUP_CONCAT(s.subscription_id) 
    FROM subscriptions s 
    WHERE s.user_id = u.id 
) AS subscription_ids 
FROM users u 
LIMIT 10 

И я могу добавить все поля с различными SELECT GROUP_CONCAT с. Однако этот метод очень медленный с любым реальным числом строк из-за того, что MySQL соединяется с таблицей subscriptions для каждого поля. Есть ли способ, которым я могу GROUP_CONCAT все поля сразу при перечислении пользователей?

Я пробовал LEFT JOIN метод:

SELECT 
    u.id AS user_id, 
    GROUP_CONCAT(s.subscription_id) AS subscription_ids 
FROM users u 
LEFT JOIN subscriptions s 
    ON s.user_id = u.id 
LIMIT 10 

однако, что, как представляется, сцепить все из subscription_ids. Я немного зациклен, почему это сделает LEFT JOIN. Но я удивлен, что нет простого способа объединить список полей из другой таблицы.

+3

По вашему второму запросу вы пробовали 'GROUP BY u.id'? –

+0

В обоих случаях вы используете агрегатную функцию без фактического агрегирования чего-либо (по команде «GROUP BY»). Но в первом случае каждый раз, когда вызывается 'GROUP_CONCAT', его поле операции ограничено критериями s.user_id = u.id. Во втором случае, однако, такого ограничения нет. – raina77ow

+0

Вот и все. Мне нужно, по-видимому, прочитать логику «GROUP_CONCAT». – nate

ответ

1

GROUP_CONCAT является агрегатной функцией и поэтому его необходимо применять с помощью статьи GROUP BY.

SELECT 
    u.id AS user_id, GROUP_CONCAT(s.subscription_id) AS subscription_ids 
FROM 
    users u 
    LEFT JOIN subscriptions s ON s.user_id = u.id 
GROUP BY 
    u.id 
LIMIT 10 
Смежные вопросы