2011-03-08 13 views
5

Estoy teniendo un problema con la siguiente consulta (si se trata de una cuestión duplicado entonces me siento mucho, pero me parece que no puede encontrar nada hasta ahora de que me puede ayudar):MySQL en donde

SELECT d.*, GROUP_CONCAT(g.name ORDER BY g.name SEPARATOR ", ") AS members 
FROM table_d AS d LEFT OUTER JOIN table_g AS g ON (d.eventid = g.id) 
WHERE members LIKE '%p%'; 

Parece que MySQL no puede manejar una comparación de columnas GROUP_CONCAT en una cláusula WHERE. Así que mi pregunta es muy simple. ¿Hay alguna solución para esto, como usar subconsultas o algo similar? Realmente necesito este trozo de código para trabajar y no hay otra alternativa de usar aparte de manejar esto en la consulta misma.

EDIT 1:

no mostrará el código real, ya que podría ser confidencial, voy a tener que consultar con mis colegas. De todos modos, acabo de escribir este código para darte una idea de cómo se ve la declaración, aunque estoy de acuerdo contigo en que no tiene mucho sentido. Veré las respuestas a continuación en un minuto, luego te llamaré. Nuevamente gracias por toda la ayuda ya!

EDIT 2:

intentado usar HAVING, pero que sólo funciona cuando no estoy usando GROUP BY. Cuando lo intento, me da un error de sintaxis, pero cuando elimino el GROUP BY la consulta funciona perfectamente. La cuestión es que necesito el GROUP BY; de lo contrario, la consulta no tendría sentido para mí.

Datos 3:

Ok, así que he cometido un error estúpido y puso HAVING antes GROUP BY, lo que obviamente no funciona. Gracias por toda la ayuda, ¡funciona ahora!

+0

lo que está mal con 'g.name como 'peter%%' '? – ajreal

Respuesta

12

Use HAVING en lugar de WHERE.

... HAVING members LIKE '%peter%' 

WHERE aplica el filtro antes de evaluar la GROUP_CONCAT; HAVING lo aplica más tarde.

Edit: Su consulta es un poco confusa. Parece que obtendrá una sola fila con todos sus nombres en una sola cadena, a menos que no haya nadie en su base de datos llamado Peter, en cuyo caso la consulta no arrojará nada.

Quizás HAVING no es realmente lo que necesita aquí ...

+0

excelente respuesta! – BigFatBaby

+1

@dnagirl: group_concat ya tiene un alias en la selección ... es 'members' así que @awm fue completamente correcto. – BigFatBaby

+0

Sin dudas ** puede ** usar un alias en una cláusula having. ¡Intentalo! – awm

2

Trate

SELECT ... 
... 
WHERE g.name = 'peter' 

lugar. Como solo hace una simple búsqueda de nombres, no es necesario buscar en el campo derivado, simplemente haga coincidir el campo original subyacente.

0

GROUP_CONCAT es una función de agregado. Tienes que GROUP BY something. Si solo desea que todas las filas que tienen %peter% en ellos tratan

SELECT d.*, g.name 
FROM table_d AS d 
    LEFT OUTER JOIN table_g AS g 
    ON (d.eventid = g.id) 
WHERE g.name LIKE '%peter%'; 
+0

que no es del todo correcto. sí - 'GROUP_CONCAT' es una función agregada, pero no, no se requiere que 'GROUP BY' algo. MySQL simplemente agrupa todo el conjunto de resultados en el mismo grupo si no se da una declaración 'GROUP BY', que puede ser el efecto deseado aquí. – BigFatBaby

Cuestiones relacionadas