Pregunta

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

Tres consultas pegadas, un poco sorta.Sin embargo, el conjunto de resultados que vuelve refleja los resultados de la consulta #3 antes de que los resultados de la consulta #1 que es no deseado.

Es allí cualquier manera de dar prioridad a estos, de modo que los resultados vienen como todos los de la consulta #1, entonces todos los de la consulta #2, a continuación, todos para la consulta #3?No quiero hacer esto en PHP por el momento (por no hablar de tener que controlar a los resultados que se presentaron en la primera consulta no mostrar en la segunda y así sucesivamente).

¿Fue útil?

Solución

Tal vez debería intentar incluyendo una cuarta columna, que indica la tabla de la que proviene, y, a continuación, ordenar y agrupar por:

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

Otros consejos

Agregar una columna adicional con valores codificados que se utilizará para ordenar el total conjunto de resultados, 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

Se puede hacer 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

SELECT distinct a,b,c DE la ( SELECCIONE a,B,C,1 como s FROM tabla where campo LIKE 'query%' La UNIÓN SELECCIONE a,B,C,2 o FROM tabla where campo LIKE '%consulta' La UNIÓN SELECCIONE a,B,C,3 como o FROM tabla where campo LIKE '%consultas%' ) ORDEN o ASC LIMIT 5

Sería mi forma de hacerlo.No sé cómo escalas.

No entiendo la

GROUP BY B ORDER BY B ASC LIMIT 5

¿Se aplica sólo a la última SELECCIONE en la unión?

¿De mysql en realidad le permiten grupo por una columna y todavía no los agregados en las otras columnas?

EDITAR:aaahh.Veo que mysql en realidad tiene.Es una versión especial de DISTINTA(b) o algo así.No quiero tratar de ser un experto en esa zona :)

Si no hay una especie que tiene sentido para el fin de ellos que deseo, no de la unión de los resultados juntos - acabo de volver de 3 diferentes conjuntos de registros, y tratar con ellos en consecuencia en el nivel de datos.

Finalmente me (mirando todas las sugerencias) llegó a esta solución, es un poco de 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

ofrece 5 resultados en total, se ordena a partir de la cuarta "columna" y me da lo que necesito;un resultado natural de ajuste (su venir AJAX), y un comodín conjunto de resultados de la siguiente a la derecha después.

:)

/mp

Hay dos varients de la UNIÓN.

'UNION' and 'UNION ALL'

En la mayoría de los casos lo que queremos decir en realidad es la UNIÓN de TODOS, ya que no duplicar eliminación (Creo SELECT DISTINCT) entre los conjuntos que puede resultar en un poco de ahorro en términos de tiempo de ejecución.

Otros han sugerido varios conjuntos de resultados, que es una solución viable sin embargo, me gustaría advertir en contra de este en el tiempo de las aplicaciones sensibles o aplicaciones conectadas a través de redes Wan ya que al hacerlo puede resultar en significativamente más viajes de ida y vuelta en el cable entre el servidor y el cliente.

No entiendo por qué la necesidad de la unión para tomar los datos de una sola tabla SELECT A ,B ,C FROM table WHERE field LIKE 'query%' or field LIKE '%query' or field LIKE '%query%' GROUP BY B ORDER BY B ASC LIMIT 5

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top