MySQL-多次将多行连接到单行
我试图为单行连接多行信息,但每次连接中有更多行时,它似乎都会成倍增加 我的表格结构如下:MySQL-多次将多行连接到单行,mysql,sql,Mysql,Sql,我试图为单行连接多行信息,但每次连接中有更多行时,它似乎都会成倍增加 我的表格结构如下: news id | title | public ------------------------ 1 | Test | 0 news_groups_map id | news_id | members_group_id ------------------------------------ 1 | 1 | 5 2 | 2 | 6
news
id | title | public
------------------------
1 | Test | 0
news_groups_map
id | news_id | members_group_id
------------------------------------
1 | 1 | 5
2 | 2 | 6
members_groups_map
id | member_id | group_id
------------------------------
1 | 750 | 5
2 | 750 | 6
title | public | news_groups | user_groups
-------------------------------------------------
Test | 0 | 5,6,5,6 | 6,6,5,5
到目前为止,我得到的问题是:
SELECT
n.title,
n.public,
CAST(GROUP_CONCAT(ngm.members_group_id) AS CHAR(1000)) AS news_groups,
CAST(GROUP_CONCAT(member_groups.group_id) AS CHAR(1000)) AS user_groups
FROM news n
LEFT JOIN news_groups_map ngm ON n.id = ngm.news_id
JOIN (
SELECT group_id
FROM members_groups_map
WHERE member_id = 750
) member_groups
WHERE n.public = 0
GROUP BY n.id
然而,结果如下:
news
id | title | public
------------------------
1 | Test | 0
news_groups_map
id | news_id | members_group_id
------------------------------------
1 | 1 | 5
2 | 2 | 6
members_groups_map
id | member_id | group_id
------------------------------
1 | 750 | 5
2 | 750 | 6
title | public | news_groups | user_groups
-------------------------------------------------
Test | 0 | 5,6,5,6 | 6,6,5,5
正如您所看到的,新闻组
和用户组
是重复的,因此如果一篇新闻文章分为3组,那么用户组
也将相乘,并显示类似于5,6,6,6,5,5
如何对这些组进行分组,使它们只显示一次
这里的最终目标是比较新闻组
和用户组
。所以,如果至少有一个组匹配(意味着用户有足够的权限),那么应该返回一个布尔值,返回true
,否则返回false
。我也不知道该怎么做,但是,我认为我应该首先对分组进行排序,因为一旦分组的数量增加,就会选择不必要的大量相同数据
谢谢 在组中使用DISTINCT\u CONCAT
...
CAST(GROUP_CONCAT(DISTINCT ngm.members_group_id) AS CHAR(1000)) AS news_groups,
CAST(GROUP_CONCAT(DISTINCT member_groups.group_id) AS CHAR(1000)) AS user_groups
...
在组中使用DISTINCT\u CONCAT
...
CAST(GROUP_CONCAT(DISTINCT ngm.members_group_id) AS CHAR(1000)) AS news_groups,
CAST(GROUP_CONCAT(DISTINCT member_groups.group_id) AS CHAR(1000)) AS user_groups
...
最简单的方法是使用
distinct
:
SELECT n.title, n.public,
GROUP_CONCAT(DISTINCT ngm.members_group_id) AS news_groups,
GROUP_CONCAT(DISTINCT mg.group_id) AS user_groups
FROM news n LEFT JOIN
news_groups_map ngm
ON n.id = ngm.news_id CROSS JOIN
(SELECT group_id
FROM members_groups_map
WHERE member_id = 750
) mg
WHERE n.public = 0
GROUP BY n.id;
这个查询实际上没有意义。首先,不需要子查询:
SELECT n.title, n.public,
GROUP_CONCAT(DISTINCT ngm.members_group_id) AS news_groups,
GROUP_CONCAT(DISTINCTD mg.group_id) AS user_groups
FROM news n LEFT JOIN
news_groups_map ngm
ON n.id = ngm.news_id CROSS JOIN
members_groups_map mg
ON member_id = 750
WHERE n.public = 0
GROUP BY n.id;
其次,
CROSS-JOIN
(或者相当于,JOIN
,没有ON
子句)没有意义。通常情况下,我希望其他表中有一个连接条件。最简单的方法是使用distinct
:
SELECT n.title, n.public,
GROUP_CONCAT(DISTINCT ngm.members_group_id) AS news_groups,
GROUP_CONCAT(DISTINCT mg.group_id) AS user_groups
FROM news n LEFT JOIN
news_groups_map ngm
ON n.id = ngm.news_id CROSS JOIN
(SELECT group_id
FROM members_groups_map
WHERE member_id = 750
) mg
WHERE n.public = 0
GROUP BY n.id;
这个查询实际上没有意义。首先,不需要子查询:
SELECT n.title, n.public,
GROUP_CONCAT(DISTINCT ngm.members_group_id) AS news_groups,
GROUP_CONCAT(DISTINCTD mg.group_id) AS user_groups
FROM news n LEFT JOIN
news_groups_map ngm
ON n.id = ngm.news_id CROSS JOIN
members_groups_map mg
ON member_id = 750
WHERE n.public = 0
GROUP BY n.id;
其次,
CROSS-JOIN
(或者相当于,JOIN
,没有ON
子句)没有意义。通常情况下,我希望其他表中有一个连接条件。谢谢,DISTINCT
出于某种原因,我甚至没有想到。你说得很好,我可以在查询之前准备好用户组
,而不是成员id
。在这种情况下,我如何使用它与新闻组进行交叉检查?对于单个值,我可以在
中使用,但如何使用或
的功能检查多个值(因此两个值都匹配)?谢谢,DISTINCT
由于某种原因甚至没有出现在我的脑海中。你说得很好,我可以在查询之前准备好用户组
,而不是成员id
。在这种情况下,我如何使用它与新闻组进行交叉检查?对于单个值,我可以在
中使用,但如何使用或
的功能检查多个值(因此两个值都匹配)?