2011-10-28 15 views
5

devo tavoli come:SQL - ordine dalla dichiarazione

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 

e voglio ottenere ogni riga della tabella A e ordinare seguendo:

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. 

io so che posso avere sql specifico per ottenere i primi due utenti, e solo il resto . Ma non dovrei riuscire a ottenerli tutti con un buon ORDINE per dichiarazione? Come limitare la prima affermazione di ordine a influenzare solo la prima riga ...

+1

Se hai una risposta alla tua domanda, ti preghiamo di accettarla. –

risposta

4

Qualcosa di simile?

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 

Prima sorta tutti i risultati in base al campo dell'anno nella tabella B, che si ottiene 2011, 2010, ecc ... Tutti i membri che non sono elencati nella tabella B avranno un anno nulla e ordinare alla parte inferiore del la lista. Prossimo ordinamento da parte di B.member non essendo null - mysql costringerà questo risultato booleano in un intero 1 o 0, che può essere ordinato, Quindi ordina in modo discendente per rendere tutti gli 1 (non B.members nulli) in ordine per primi.

+0

Allmost got it: ORDER BY (tableb.year IS NULL) ASC, (tableb.member IS NOT NULL) DESC. Ottiene tutto il più corretto, il problema ora è che voglio prima ottenere B.catA, poi B.catB. E anche se è possibile, voglio solo le ultime in catA e catB, dopo che l'ordine non importa ... – joxxe

+0

Risolto il problema: ORDINA DA (CASO tableB.year QUANDO ESTRATTO (ANNO DA ora()) POI 0 ELSE 1 FINE) ASC, tabellaA.id desc; – joxxe

0

In base alle vostre regole di ordinamento:

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

Presumo che ci sono alcuni utenti in tabella A che non esistono in B, in modo che ci si vuole utilizzare 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

Si può sempre 'ordine da', comunque grottescamente complicato la vostra selezione è, acquistare mettendo gli elementi di raccolta dei dati in una tabella derivata, la selezione da essa, e l'ordinamento dei risultati. Qualcosa di simile ...

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 

Devi solo per assicurarsi che tutte le colonne si selezionano in ciascuna delle query venire fuori lo stesso, o far fronte con un valore NULL altrimenti.