2010-07-04 14 views
8

me gustaría obtener de una sola tabla, todas las filas, pero pedirlas de diferentes maneras. Por ejemplo que escriboSELECT UNION y ORDER BY en mysql ... ¿cómo?

(SELECT * FROM table1 
ORDER BY fieldA ASC LIMIT 3 
) 
UNION 
(
SELECT * FROM table1 
ORDER BY FieldB DESC 
) 

Funciona, excpet que la segunda orden de (FIELDB DESC) se ignora ... Alguien sabe por qué? Gracias

+2

Ver [UNION Sintaxis] (http://dev.mysql.com/doc/refman/5.0/en/union.html) . Busque 'uso de ORDER BY para declaraciones individuales SELECT no implica nada sobre el orden'. Ver también [esta publicación SO] (http://stackoverflow.com/questions/3163503/sorting-union-queries-in-mysql/3163526#3163526). – Mike

+0

guau, funcionó ... pero ¿cómo puede funcionar? mmm .. estoy un poco confundido ..! – stighy

Respuesta

17

El operador UNION realiza un tipo implícito como parte de la operación de unión (IIRC, en la (s) columna (s) de la clave).

Si desea otra clasificación en el resultado, debe aplicar un ORDER BY a la selección de unión.

En su caso, necesita alguna manera de distinguir entre la primera selección y la segunda, para que pueda ordenar la unión correctamente. Algo así como (no probado):

(SELECT table1.*, 0 AS TMP_ORDER FROM table1 ORDER BY fieldA ASC LIMIT 3) 
UNION 
(SELECT table1.*, 1 AS TMP_ORDER FROM table1) 
ORDER BY TMP_ORDER ASC, 
CASE WHEN TMP_ORDER = 0 THEN fieldA ELSE 0 END ASC, 
CASE WHEN TMP_ORDER = 1 THEN fieldB ELSE 0 END DESC 

El problema con este enfoque es que usted tendrá duplicados para las tres filas seleccionadas como parte de la primera consulta en el UNION (ya que las columnas no coinciden totalmente).

¿Estás seguro de que no puedes usar dos estatutos SELECT en su lugar?

+0

@Mike, esa pregunta no requiere una ordenación distinta basada en el orden de unión. Ahí es donde aparece la instrucción 'CASE'. –

+0

El' de selección '' externo no es necesario, así como la consulta interna 'order by's no haciendo nada en la segunda consulta ya que no hay límite:' (seleccione t1. *, 0 tmp_order de t1 orden por campoA asc límite 3) unión (seleccione t2. *, 1 de t2) orden por tmp_order, case ... ' – Donnie

+0

+1 @Mike - esa respuesta solo ordena por qué subconsulta llegaron los datos , no hay clasificación de segundo nivel para garantizar que FieldA y FieldB también se clasifiquen a partir de sus respectivas consultas. La respuesta aquí incluye el tipo de segundo nivel. – mdma

1

Se puede declarar la segunda SELECT como resultado fijo ..

SELECT 'First select option' AS something 

UNION 

SELECT something 
FROM(
    (SELECT something 
    FROM SomeTable 
    ORDER BY something ASC)) FixedResult