【问题标题】:MySQL group_concat with where clauseMySQL group_concat 与 where 子句
【发布时间】: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子句以获得预期的输出

标签: mysql sql where group-concat clause


【解决方案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 选择的客户的所有模块
    猜你喜欢
    • 2022-01-08
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多