1

我正在分析一些查询,并在尝试从基于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_CONCATs 的字段。但是,由于 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

但是,这似乎连接了所有的订阅 ID。我有点难过为什么LEFT JOIN会这样做。但令我惊讶的是,似乎没有一种简单的方法可以连接来自不同表的字段列表。

4

1 回答 1

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
于 2013-09-14T18:04:11.407 回答