MySQL group_concat with where子句

MySQL group_concat with where子句,mysql,sql,where,group-concat,clause,Mysql,Sql,Where,Group Concat,Clause,我遇到了组Concat和where过滤器的问题。在我的表中,我得到了链接到客户端的模块名。我想按模块名搜索客户机,但在concat组中,我仍然希望看到客户机拥有的所有模块。目前,它将显示带有这些模块的所有客户端,但它将仅显示该特定模块。我想不出如何让他们两个一起工作 有没有关于如何获得预期结果的建议 这些是一些基本表和我尝试的查询,以及我得到的结果和我真正想要的结果 Client +--------------------+ | id | name | +-----------

我遇到了组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  |
+------------------------------------------------------+
试试看

   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\u module.id
    错误已修复为
    client\u module.id

  • 您已经对WHERE子句说过只返回1和2

  • 当您有Group_Concat时,将Group by添加到工作中


您正在使用
客户端模块。模块id
将其更改为
客户端模块。客户端id
。 使用
group by
group\u 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
你可以这样试试

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

您在查询中使用
WHERE client_module.module_id IN(1,2)
这里有什么问题?我的错,那不是在原始查询中去掉的错误部分。更正了吗?问题解决了吗?没有问题了。您在(1,2)中使用的是
client\u module.module\u id,这是一个模型缺陷,因此它显然只会选择module1和module2..删除where子句以获得预期的输出这是一个有用的查询,但它不会执行OP要求的操作。OP只想列出有module1或module2行的客户端;但他希望看到每个客户机的所有模块的列表。您的答案所做的是列出由客户id选择的客户机的所有模块。这是一个有用的查询,但它不符合OP的要求。问题是通过指定模块来筛选客户机,然后列出这些客户机的所有模块。此查询需要提供客户端ID列表。