tablas subconsulta registros group_concat funcion español consultas concatenar mysql sql oracle union

subconsulta - ¿Cómo puedo concatenar conjuntos de resultados completos en MySQL?



group_concat mysql (7)

¿Puedes hacerlo como una subselección, algo así como

select * from ( SELECT A,B,C FROM table WHERE field LIKE ''query%'' UNION SELECT A,B,C FROM table WHERE field LIKE ''%query'' UNION SELECT A,B,C FROM table WHERE field LIKE ''%query%'' ) ORDER BY B ASC LIMIT 5

Estoy probando la siguiente consulta:

SELECT A,B,C FROM table WHERE field LIKE ''query%'' UNION SELECT A,B,C FROM table WHERE field LIKE ''%query'' UNION SELECT A,B,C FROM table WHERE field LIKE ''%query%'' GROUP BY B ORDER BY B ASC LIMIT 5

Esas tres preguntas están juntas, kindasorta. Sin embargo, el conjunto de resultados que se devuelve refleja los resultados de la consulta n. ° 3 ANTES de los resultados de la consulta n. ° 1 (no deseada).

¿Hay alguna manera de priorizar estos para que los resultados lleguen todos para la consulta n. ° 1, luego todos para la consulta n. ° 2 y luego todos para la consulta n. ° 3? No quiero hacer esto en PHP todavía (sin mencionar tener que controlar los resultados que aparecieron en la primera consulta para no mostrarlos en el segundo y así sucesivamente).

editar: muchas gracias a todos! la solución resultó ser una mezcla de todas las respuestas. funcionó maravillosamente !.


Agregue una columna adicional con valores codificados que usará para ordenar el conjunto de resultados en general, así:

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE ''query%'' UNION SELECT A,B,C,2 as [order] FROM table WHERE field LIKE ''%query'' UNION SELECT A,B,C,3 as [order] FROM table WHERE field LIKE ''%query%'' GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5


SELECCIONAR distintas a, b, c FROM (SELECCIONAR A, B, C, 1 como o FROM tabla WHERE campo LIKE ''query%'' UNION SELECT A, B, C, 2 como o FROM tabla WHERE campo LIKE ''% query'' UNION SELECT A, B, C, 3 como o FROM tabla WHERE campo LIKE ''% query%'') ORDER BY o ASC LIMIT 5

Sería mi manera de hacerlo. No sé cómo esa escala.

No entiendo el

GROUP BY B ORDER BY B ASC LIMIT 5

¿Se aplica solo al último SELECT en la unión?

¿Realmente mysql te permite agrupar por una columna y aún no hacer agregados en las otras columnas?

EDITAR: aaahh. Veo que mysql realmente lo hace. Es una versión especial de DISTINCT (b) o algo así. No quisiera tratar de ser un experto en esa área :)


Si no hay un tipo que tenga sentido para ordenarlos, no combine los resultados, simplemente devuelva 3 conjuntos de registros separados y trátelos en consecuencia en su nivel de datos.


Tal vez deberías intentar incluir una cuarta columna, indicando la tabla de la que procede, y luego ordenarla y agruparla:

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE ''query%'' UNION SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE ''%query'' UNION SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE ''%query%'' GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5


Eventualmente (mirando todas las sugerencias) llegué a esta solución, es un compromiso entre lo que necesito y el tiempo.

SELECT * FROM (SELECT A, B, C, "1" FROM table WHERE B LIKE ''query%'' LIMIT 3 UNION SELECT A, B, C, "2" FROM table WHERE B LIKE ''%query%'' LIMIT 5) AS RS GROUP BY B ORDER BY 1 DESC

entrega 5 resultados en total, ordena desde la cuarta "columna" y me da lo que necesito; un conjunto de resultados natural (viene sobre AJAX) y un conjunto de resultados de comodín después.

:)

/ mp


Hay dos variantes de UNION.

''UNION'' and ''UNION ALL''

En la mayoría de los casos, lo que realmente quiere decir es UNIÓN TODO, ya que no elimina por duplicado (Piense SELECT DISTINCT ) entre conjuntos, lo que puede generar un ahorro considerable en términos de tiempo de ejecución.

Otros han sugerido múltiples conjuntos de resultados, que es una solución viable; sin embargo, advertiría en contra de esto en aplicaciones sensibles al tiempo o aplicaciones conectadas a través de WAN, ya que al hacerlo puede provocar significativamente más viajes de ida y vuelta entre el servidor y el cliente.