2

我无法弄清楚我应该如何查询这个。

表格1

id    client_name   Group_id     
------------------------------
1     IBM               1
2     DELL              1   
3     DELL              2
4     MICROSOFT         3 
5     DELL              2
6     MICROSOFT         2
7     HP                3 
7     HP                1

表 2

id    group_name
------------------
1     Group1      
2     Group2     
3     Group3  

使用下面的查询。

SELECT Client_name, GROUP_CONCAT(distinct(group_name)) merge_group , count(distinct(group_name)) as num_groups
FROM Table1 t1
JOIN Table2 t2
  ON t1.group_id = t2.id
GROUP BY t1.Client_name
ORDER BY t1.Id having num_groups > 1

将由此产生

client_name      merge_group   
-------------------------
DELL               Group1,Group2
MICROSOFT          Group2,Group3
HP                 Group1,Group3

如果我选择 Group2,我需要过滤 merge_group

结果是这样的

client_name      merge_group   
-------------------------
DELL               Group1,Group2
MICROSOFT          Group2,Group3

或者如果我查询 Group1,结果就是这样。

client_name      merge_group   
-------------------------
DELL               Group1,Group2
HP                 Group1,Group3
4

3 回答 3

3

试试下面:

SELECT Client_name, GROUP_CONCAT(distinct(group_name)) merge_group , count(distinct(group_name)) as num_groups
FROM Table1 t1
JOIN Table2 t2  ON t1.group_id = t2.id
GROUP BY t1.Client_name
HAVING num_groups > 1
AND merge_group LIKE '%Group1%'
于 2013-07-08T07:54:55.437 回答
0

只需引入 where 子句并过滤组名即可。

SELECT Client_name, GROUP_CONCAT(distinct(group_name)) merge_group , count(distinct(group_name)) as num_groups
FROM Table1 t1
JOIN Table2 t2
  ON t1.group_id = t2.id
WHERE group_name = 'Group1' 
GROUP BY t1.Client_name
ORDER BY t1.Id having num_groups > 1

您也可以使用HAVING子句进行字符串比较。

于 2013-07-08T07:52:58.730 回答
0

FIND_IN_SET()在这种情况下,也可以使用方法进行过滤。这是可以做到的:

SELECT
    client_name
    , GROUP_CONCAT(DISTINCT group_name) AS merge_group
    , COUNT(DISTINCT group_name) AS num_groups
FROM table1 AS t1
JOIN table2 AS t2 ON t1.group_id = t2.id
GROUP BY t1.client_name
HAVING num_groups > 1
AND FIND_IN_SET('Group1', merge_group)

逗号用作 的默认分隔符GROUP_CONCAT(),因此可以将每个组作为一个集合进行过滤。在许多情况下,它会比REGEXPor更安全LIKE。他们在字符串中搜索可以在上述情况下轻松使用的单词,但使用大型数据集是有风险的,其中一个组名是另一个组名的子字符串。

于 2021-10-04T10:11:10.520 回答