LIKE group_concat with where 子句
LIKE group_concat with where clause
我在 group 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 |
+------------------------------------------------------+
这应该有效
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
即可使用 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;
我在 group 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 |
+------------------------------------------------------+
这应该有效
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
即可使用 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;