我正在分析一些查询,并在尝试根据user_id
从不同的表中提取多个字段时发现了一些有趣的结果。请考虑以下表格:
+------------------------+------------------+------+-----+---------+----------------+
| 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_id的全部。我有点难过为什么LEFT JOIN
会这样做。但我很惊讶似乎没有一种简单的方法来连接来自不同表的字段列表。
答案 0 :(得分: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