繁体   English   中英

在左联接上选择group_concat vs group_concat

[英]select group_concat vs group_concat on left join

我正在分析一些查询,并在尝试基于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会这样做。 但令我惊讶的是,似乎没有一种简便的方法来连接来自另一个表的字段列表。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM