2011-10-28 17 views
5

tengo tablas como:SQL - ORDER BY

table A 
id name email 
1 test1 [email protected] 
2 test2 [email protected] 
3 test3 [email protected] 
4 test4 .... 
5 test5 .... 

table B 
id catA catB year member 
1 false true 2011 2 
2 true false 2011 3 
3 fals true 2010 5 

y quiero conseguir cada fila de la tabla A y ordenar siguiendo:

FIRST, get user 2 (current year, based on table B) 
SECOND, get user 3 (current year, based on table B) 
after that get users that is in table B 
after that get all other users. 

Sé que puedo tener un sql específico para obtener los dos primeros usuarios, y el solo el resto . ¿Pero no debería ser capaz de obtenerlos a todos con una ORDEN agradable por declaración? Como limitar el enunciado de primer orden para que solo afecte a la primera fila ...

+1

Si tiene una respuesta a su pregunta, acéptela. –

Respuesta

4

¿Algo como esto?

select A.id, A.name, A.email, B.catA, B.catB, B.year 
from A 
join B on A.id = B.member 
ORDER BY B.year DESC, (B.member IS NOT NULL) DESC 

primero ordenar los resultados por el campo del año en el cuadro B, que te lleva 2011, 2010, etc ... Todos los miembros que no están listados en la Tabla B tendrán un año nulo y ordenar a la parte inferior de la lista. Siguiente ordenado por B.member no siendo nulo: mysql forzará este resultado booleano a un entero 1 o 0, que se puede ordenar, por lo tanto, ordene descender para ordenar primero los 1 (no los B.members nulos).

+0

Casi lo tengo: PEDIDO POR (tableb.year IS NULL) ASC, (tableb.member IS NOT NULL) DESC. Lo más correcto, el problema ahora es que quiero obtener primero B.catA, luego B.catB. Y también si es posible, solo quiero lo último en catA y catB, después de eso el orden no importa ... – joxxe

+0

Se corrigió: PEDIDO POR (CASE tableB.year CUANDO EXTRA (AÑO DESDE ahora()) ENTONCES 0 ELO 1 END) ASC, tableA.id desc; – joxxe

0

Sobre la base de sus reglas de ordenación:

after that get users that is in table B 
after that get all other users. 

Asumo que hay algunos usuarios de la tabla A que no existen en B, por lo que te gustaría utilizar un LEFT JOIN.

SELECT a.id, a.name, a.email 
    FROM a 
     LEFT JOIN b 
      ON a.id = b.member 
    ORDER BY ISNULL(b.year), b.year DESC, a.name 
0

Siempre se puede 'por fin', sin embargo grotescamente complicado es su selecto, poniendo comprar los elementos de recopilación de datos en una tabla derivada, la selección de la misma, y ​​el pedido por los resultados. Algo así como ...

SELECT col1, 
     col2, 
     col3 
    FROM 
     (SELECT 1 as col1, 
       col2, 
       ' ' AS col3 
      FROM blah...blah...blah 
      UNION 
     SELECT 2 AS col1 
       col2, 
       col3 
      FROM blah...blah...blah 
      UNION 
     and so on) myderivedtable 
    ORDER BY col1, 
      col2, 
      col3 

Sólo hay que asegurarse de que todas las columnas que está seleccionando en cada una de las consultas salido de la misma, o hacer frente a un valor NULL en otro caso.