首页 > 解决方案 > SQL phpmyadmin SELECT 并在父 SELECT 的列中将多个字段作为字符串 concat 返回

问题描述

我有 3 张桌子。用户、内容和类别。因此,用户编写内容并为此选择类别。

categories                       users
--------------------------       ----------------------
category_id  category_name       user_id user_name ...

contents
------------------------------------------------
content_id content_creator content_category ...

所以目录中有两个引用。

我需要什么:我想要一个所有类别的列表,并且对于每一行,我想显示包含该类别的内容的数量以及在其内容中使用该类别的用户。

我做了什么

我试过这个查询,它工作正常

SELECT ca.category_id,ca.category_name,
        COUNT(c.content_id) AS contents_count,
        COUNT(c.content_creator) AS contents_creators_count
        FROM categories ca
        JOIN contents c ON (ca.category_id = c.content_category)
        GROUP BY content_category

结果如我所愿

category_id  category_name  contents_count  contents_creators_count
6            cat1           6               3
8            cat2           1               1
9            cat3           1               1
10           cat4           2               2
11           cat5           2               2

问题:我可以将所有users.user_id以字符串或数组的形式作为结果列吗?

就像我试过这个但它只适用于一排

SELECT ca.category_id,ca.category_name,
COUNT(c.content_id) AS contents_count,
(
    SELECT u.user_id,u.User_name
    FROM users u
    JOIN contents c ON (u.user_id = c.content_id)
    JOIN categories ca ON (c.content_category=ca.category_id)
    
)AS category_users
FROM categories ca
JOIN contents c ON (ca.category_id = c.content_category)
GROUP BY ca.category_id

我想要这样的结果:

category_id  category_name  contents_count  category_users //based on user_id
6            cat1           6               63,88,125
8            cat2           1               63
9            cat3           1               88
10           cat4           2               88,70
11           cat5           2               null //like this category not used

标签: mysqlsql

解决方案


你似乎想要字符串聚合:MySQL 提供GROUP_CONCAT()了这个。如果你想要每个内容的(不同的)内容创建者列表,你不需要带 users 表;该信息已经可用contents

所以:

select ca.category_id, ca.category_name, 
    count(*) as contents_count,
    group_concat(DISTINCT content_creator ORDER BY content_creator) category_users 
from categories ca
inner join contents c on ca.category_id = c.content_category
group by ca.category_id

推荐阅读