Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-多次将多行连接到单行_Mysql_Sql - Fatal编程技术网

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
。在这种情况下,我如何使用它与
新闻组进行交叉检查?对于单个值,我可以在
中使用
,但如何使用
的功能检查多个值(因此两个值都匹配)?