2008-08-06 15 views
20

Estoy probando la siguiente consulta:¿Cómo puedo concatenar conjuntos de resultados completos en MySQL?

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 

Es decir, tres consultas pegados, 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).

Respuesta

16

tal vez debería intentar incluir una cuarta columna, que indica la tabla que viene, y entonces el orden y el grupo por ella:

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 
3

¿Puede 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 
0

Si no hay una especie que tenga sentido para ordenarles que usted desea, no hacer la unión de los resultados juntos - sólo devolver 3 registros separados , y tratar con ellos en consecuencia en su nivel de datos.

6

Añadir una columna adicional con los valores no modificables que va a utilizar 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 
0

que finalmente (mirando a todas las sugerencias) llegaron a esta solución, es un poco de un compromiso entre lo que necesito y 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 

ofrece 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

1

SELECT DISTINCT a, b, c FROM ( SELECT A, B, C, 1 como O FROM tabla WHERE campo como 'consulta%' UNION SELECT A , B, C, 2 como o FROM tabla WHERE campo LIKE '% query' UNION SELECCIONE A, B, C, 3 como o FROM tabla WHERE campo LIKE '% query%' ) PEDIDO o o ASC LIMIT 5

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

No entiendo la

GROUP BY B ORDER BY B ASC LIMIT 5 

¿Se aplica solamente a este último SELECT en la unión?

¿Realmente mysql le permite agrupar por una columna y todavía 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 me gustaría tratar de ser un experto en esa área :)

0

Hay dos variantes de UNION.

'UNION' and 'UNION ALL' 

En la mayoría de los casos lo que realmente quiere decir es UNION ALL, ya que no hace eliminación duplicado (Piense SELECT DISTINCT) entre las series que pueden resultar en un poco de ahorro 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 contra esto en aplicaciones sensibles al tiempo o aplicaciones conectadas a través de WAN ya que hacerlo puede ocasionar muchos más viajes redondos entre el servidor y el cliente.

Cuestiones relacionadas