Я анализирую несколько запросов и заметил некоторые интересные результаты при попытке извлечь несколько полей из разных таблиц на основе 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
. Но я удивлен, что нет простого способа объединить список полей из другой таблицы.
По вашему второму запросу вы пробовали 'GROUP BY u.id'? –
В обоих случаях вы используете агрегатную функцию без фактического агрегирования чего-либо (по команде «GROUP BY»). Но в первом случае каждый раз, когда вызывается 'GROUP_CONCAT', его поле операции ограничено критериями s.user_id = u.id. Во втором случае, однако, такого ограничения нет. – raina77ow
Вот и все. Мне нужно, по-видимому, прочитать логику «GROUP_CONCAT». – nate