2010-11-24 15 views
8

¿Es posible pedir la primera consulta y mantener las filas devueltas como primero y no solicitar la segunda consulta? (Si eso tiene SENCE)MYSQL UNION PEDIDO

Un ejemplo de mi investigación actual es:

SELECT 
    * 
FROM 
    Devices 
WHERE 
    Live = 'true' 
    AND Category = 'apple' 
ORDER BY 
    ListOrder 
UNION 
SELECT 
     * 
    FROM 
     Devices 
    WHERE 
     DeviceLive = 'true' 

Tenía la esperanza de que los dispositivos dentro de la categoría de manzana se organizan allí orden de la lista y sería en la parte superior de la lista encima de los otros dispositivos. Pero esto parece mezclar las dos preguntas juntas.

Respuesta

15

Tendrá que introducir una clave de clasificación artificial. Algo así como:

SELECT 
    *, 1 as SortKey 
FROM 
    Devices 
WHERE 
    Live = 'true' 
    AND Category = 'apple' 
UNION 
SELECT 
     *, 2 as SortKey 
    FROM 
     Devices 
    WHERE 
     DeviceLive = 'true' 
ORDER BY SortKey, ListOrder 
+0

Así es como lo he logrado en el pasado – Sonny

+0

¡Funcionó como un regalo, gracias Joe! – Yardstermister

+0

hola, no tuve que hacer una clave de clasificación artificial, solo me aseguré de que ambas tablas tuvieran el mismo nombre de la columna que quería ordenar. En mi caso, el nombre de la columna era "orden". Entonces lo hice: Seleccione *, ordene como uOrden de la tabla 1 UNION select *, ordene como uOrder de la tabla 2 ORDER BY u Order –

2

Usted podría fingir

SELECT col1, col2 ... 
FROM (
    SELECT 1 fake_order, col1, col2 ... FROM Devices WHERE Live ='true' AND Category='apple' ORDER BY ListOrder 
    UNION ALL 
    SELECT 2, col1, col2 ... FROM Devices WHERE DeviceLive ='true' 
) AS T 
ORDER BY fake_order 

(SQL No comprobado la parte superior de la cabeza)

+0

Sé que esto es antiguo, pero para ser completo (y noto que dice que esto no ha sido probado), usted tiene que nombrar la consulta interna para que esto funcione. –

+0

@TomHeard - Gracias, he actualizado la consulta – Tony

+0

Suelta el 'AS' y eres bueno. –

2

UNION tiene una función de de-duplicación implícita. Esto significa que un efecto secundario de usarlo es que todo se mezcla al estar ordenado para que eso suceda. También (por lo general, pero no siempre) significa que obtendrá un resultado ordenado (consulte el siguiente párrafo).

UNION ALL elimina esto, pero aún existe la advertencia de que la salida de una consulta sin un explícito order by no garantiza la realización de pedidos. Esto ha sido cubierto por otra respuesta, pero pensé que valía la pena señalar por qué es importante.

+0

Gracias, estaba buscando una razón por la cual mi plan de ejecución estaba haciendo una especie de. Esto lo responde y mi extraño problema de pedido. –

0

Tengo mi respuesta de Joe Stefanelli, pero modifiqué un poco:

hola, yo no tenía necesidad de hacer una clave de ordenación artificial, sólo se aseguró de que cada tabla tanto tenía el mismo nombre de la columna que quería ordenar. En mi caso, el nombre de la columna era "orden". Así que lo hice:

Select *, order as uOrder from table 1 
UNION 
select *, order as uOrder from table 2 
ORDER BY uOrder