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