es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“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 |
+——————————————————+

Tags:  , ,

Answer

  1. Avatar for 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:

    SELECT     client.id, client.name, GROUP_CONCAT(module.name) AS modules
    FROM       client
    LEFT JOIN  (
                  SELECT client_id, module_id 
                  FROM client_module 
                  WHERE module_id IN (
                                       SELECT id 
                                       FROM module 
                                       WHERE name LIKE '%module1%'
                                      )
                ) AS cm ON cm.client_id = client.id
    LEFT JOIN  module ON module.id = cm.module_id
    group by client.id
    

    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 entre client y client_module.

    Al hacer esto, podrá obtener todos los módulos asociados al cliente incluso si no coinciden con el LIKE sin usar HAVING.

Comments are closed.