【问题标题】:LIKE group_concat with where clauseLIKE group_concat 与 where 子句
【发布时间】:2022-01-08 05:00:52
【问题描述】:

我在组 concat 中使用 Like 并且我想将所有模块附加到客户端,即使它与 LIKE 不匹配,我知道我可以用 HAVING 做到这一点,但我不想使用 HAVING,任何WHERE 或连接条件的解决方案?

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

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

表格

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          | 1          |
| 1          | 3          |
| 2          | 1          |
| 2          | 2          |
| 2          | 4          |
| 3          | 2          |
| 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.name LIKE '%module1%'
group by client.id

结果:

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

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

【问题讨论】:

  • 你为什么用WHERE module.name LIKE '%module1%'?
  • 为什么客户端 3 没有出现 - 好像拿了模块 1
  • 我想显示所有客户端包含模块名称

标签: mysql sql conditional-statements


【解决方案1】:

不用HAVING 也可以使用EXISTS:

SELECT  c.id, c.name, GROUP_CONCAT(m.name) AS modules
FROM    client AS c
        INNER JOIN client_module AS cm
            ON cm.client_id = c.id
        INNER JOIN module AS m
            ON m.id = cm.module_id
WHERE   EXISTS
        (   SELECT  1
            FROM    client_module AS cm2
                    INNER JOIN module AS m2
                        ON m2.id = cm2.module_id
            WHERE   m2.name LIKE '%module1%' 
            AND     cm2.client_id = c.id
        )
GROUP BY  c.id, c.name;

但这效率较低,而且更冗长,因此没有任何优势。我希望您使用HAVING 的原因在很大程度上是没有根据的,我个人会采取的方法是在HAVING 子句中使用条件计数:

SELECT  c.id, c.name, GROUP_CONCAT(m.name) AS modules
FROM    client AS c
        INNER JOIN client_module AS cm
            ON cm.client_id = c.id
        INNER JOIN module AS m
            ON m.id = cm.module_id
GROUP BY  c.id, c.name
HAVING COUNT(CASE WHEN m.name LIKE '%module1%' THEN 1 END) > 0;

Example on db<>fiddle

【讨论】:

    【解决方案2】:

    这应该可以工作

    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     modules LIKE '%module1%'
    

    【讨论】:

    • 我知道我可以用 HAVING 做到这一点,但我不想使用 HAVING,任何带有 WHERE 或加入条件的解决方案?
    猜你喜欢
    • 2014-04-13
    • 2011-05-16
    • 1970-01-01
    • 2013-06-30
    • 2011-08-16
    • 2013-10-11
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多