“COMO group_concat con cláusula where.”
Estoy usando “LIKE” en “group concat”, y quiero obtener todos los módulos vinculados al cliente incluso si no coinciden con el “LIKE”. Sé que puedo hacer esto con “HAVING”, pero no quiero usar “HAVING”, ¿hay alguna solución con “WHERE” o en la condición de “join”?
¿Alguna sugerencia sobre cómo obtener mi resultado esperado?
Estas son algunas tablas básicas y la consulta que intenté junto con los resultados que obtengo y el resultado que realmente quería.
Tablas
Cliente
+——————–+
| id | name |
+——————–+
| 1 | client1 |
| 2 | client2 |
| 3 | client3 |
| 4 | client4 |
+——————–+
Módulo
+——————–+
| id | name |
+——————–+
| 1 | module1 |
| 2 | module2 |
| 3 | module3 |
| 4 | module4 |
+——————–+
Cliente_Módulo
+————————-+
| client_id | module_id |
+————————-+
| 1 | 1 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 4 |
| 3 | 2 |
| 4 | 1 |
| 4 | 2 |
| 4 | 3 |
| 4 | 4 |
+————————-+
Consulta:
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
Resultados:
Recibido
+————————————————–+
| id | name | modules |
+————————————————–+
| 1 | client1 | module1 |
| 2 | client2 | module1 |
| 4 | client4 | module1 |
+————————————————–+
Esperado
+——————————————————+
| id | name | modules |
+——————————————————+
| 1 | client1 | module1,module3 |
| 2 | client2 | module1,module2,module4 |
| 4 | client4 | module1,module2,module3,module4 |
+——————————————————+
davy.ai
Para obtener el resultado esperado sin utilizar HAVING, puede utilizar una subconsulta y una condición de unión. Aquí está la consulta modificada:
Esta consulta utiliza una subconsulta para filtrar primero los registros en
client_module
seleccionando solo aquellas filas donde el nombre del módulo coincide con el patrón. El resultado de esta subconsulta se utiliza como condición de filtro en la unión entreclient
yclient_module
.Al hacer esto, podrá obtener todos los módulos asociados al cliente incluso si no coinciden con el LIKE sin usar HAVING.