MySQL group_concat 与 where 子句

Posted

技术标签:

【中文标题】MySQL group_concat 与 where 子句【英文标题】:MySQL group_concat with where clause 【发布时间】:2014-04-13 10:06:26 【问题描述】:

我遇到了 Group_Concat 和 where 过滤器的问题。在我的表中,我得到了链接到客户端的模块名称。我想按模块名称搜索客户端,但在 concat 组中我仍然想查看客户端拥有的所有模块。目前它将显示具有这些模块的所有客户端,但它只会显示该特定模块。我不知道如何让它们一起工作。

关于如何获得预期结果的任何建议??

这些是一些基本表和我尝试的查询以及我得到的结果和我真正想要的结果

Client
+--------------------+
| id      |  name    |
+--------------------+
| 1       | client1  |
| 2       | client2  |
| 3       | client3  |
| 4       | client4  |
+--------------------+

Module
+--------------------+
| id      |  name    |
+--------------------+
| 1       | module1  |
| 2       | module2  |
| 3       | module3  |
| 4       | module4  |
+--------------------+

Client_Module
+-------------------------+
| client_id  | module_id  |
+-------------------------+
| 1          | 2          |
| 1          | 3          |
| 2          | 1          |
| 2          | 2          |
| 2          | 4          |
| 3          | 4          |
| 4          | 1          |
| 4          | 2          |
| 4          | 3          |
| 4          | 4          |
+-------------------------+

查询:

SELECT     client.id, client.name, GROUP_CONCAT(module.name) AS modules
FROM       client
LEFT JOIN  client_module ON client_module.client_id = client.id
LEFT JOIN  module ON module.id = client_module.module.id
WHERE      module.id IN (1,2)

结果:

Received
+--------------------------------------------------+
| id     | name     | modules                      |
+--------------------------------------------------+
| 1      | client1  | module2                      |
| 2      | client2  | module1,module2              |
| 4      | client4  | module1,module2              |
+--------------------------------------------------+

Expected
+------------------------------------------------------+
| id     | name     | modules                          |
+------------------------------------------------------+
| 1      | client1  | module2,module3                  |
| 2      | client2  | module1,module2,module4          |
| 4      | client4  | module1,module2,module3,module4  |
+------------------------------------------------------+

【问题讨论】:

你在查询中使用WHERE client_module.module_id IN (1,2),这里有什么问题? 我的错,那不是在原始查询中剥离了错误的部分。改正了 问题解决了吗? 没有问题。这是一个模拟缺陷 你正在使用client_module.module_id IN (1,2),所以它显然只会选择模块1和模块2..删除where子句以获得预期的输出 【参考方案1】:

你可以这样尝试。

SELECT     client.id, client.name, GROUP_CONCAT(module.name) AS modules
FROM       client
LEFT JOIN  client_module ON client_module.client_id = client.id
LEFT JOIN  module ON module.id = client_module.module_id
group by client.id Having Find_In_Set('module1',modules)>0 or Find_In_Set('module2',modules)>0

SQL Fiddle Demo

【讨论】:

【参考方案2】:

您正在使用 client_module.module_id 将其更改为 client_module.client_id。 将group bygroup_cancat 一起使用

SELECT     client.id, client.name, GROUP_CONCAT(module.name) AS modules
FROM       client
LEFT JOIN  client_module ON client_module.client_id = client.id
LEFT JOIN  module ON module.id = client_module.module_id
WHERE      client_module.client_id IN (1,2,4)
group by client.id, client.name

fiddle

【讨论】:

这是一个有用的查询,但它不符合 OP 的要求。问题是通过指定 modules 来过滤客户端,然后列出这些客户端的所有模块。此查询需要提供 client id 列表。【参考方案3】:

试试看

   SELECT     client.id, client.name, GROUP_CONCAT(module.id) AS modules
   FROM       client
   LEFT JOIN  client_module ON client_module.client_id = client.id

   LEFT JOIN  module ON module.id = client_module.module_id
   WHERE      client.id IN (1,2,4) 
   group by client.id

你把这个错误的client_module.module.id 固定为client_module.module_id

并且您已经对 WHERE 子句说只返回 1 和 2 。

当你有 Group_Concat 时添加了 Group by 来工作

DEMO HERE

【讨论】:

这是一个有用的查询,但它不符合 OP 的要求。 OP 希望列出 确实有 module1 或 module2 行的客户端;但随后他想查看每个客户端的所有 模块列表。相反,您的答案是列出 由客户 ID 选择的客户的所有模块

以上是关于MySQL group_concat 与 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 5.6.12 Group_concat 与内部连接问题

MySQL UPDATE 与 GROUP_CONCAT 加入三个表

mysql中的group_concat与“case when”条件

MySQL group_concat 与 where 子句

GROUP_CONCAT 中的双重结果与 MySQL 中的双重 JOIN

MySQL group_concat 与连接