我有3个表。用户、内容和类别。因此用户编写内容并为此选择类别。
categories users
-------------------------- ----------------------
category_id category_name user_id user_name ...
contents
------------------------------------------------
content_id content_creator content_category ...
因此contents表中有两个引用。
- content_creator=>user_id
- content_category=>category_id
我需要什么:我想要一个所有类别的列表,并且对于每一行,我想要显示包含该类别的内容计数以及在其内容中使用该类别的用户。
我做了什么:
我尝试了这个查询,它运行良好
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
问题:我是否可以将所有用户.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
您似乎想要字符串聚合:MySQL为此提供了GROUP_CONCAT()
。如果你想要每个内容的(不同的(内容创建者列表,你不需要带用户表;该信息在CCD_ 2中已经可用。
因此:
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