MySQL group_concat with where子句

时间:2014-03-10 10:38:05

标签: mysql sql where group-concat clause

我在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  |
+------------------------------------------------------+

3 个答案:

答案 0 :(得分:9)

你可以尝试这样。

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

答案 1 :(得分: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

答案 2 :(得分:0)

试试

   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