2011-10-28 19 views
5

Mam tabele jak:SQL - według oświadczenia

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 

i chcę dostać każdy wiersz w tabeli A i sortować je według następujących:

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. 

wiem, że mogę mieć specyficzny sql, aby uzyskać pierwszych dwóch użytkowników, i tylko resztę . Ale czy nie powinienem mieć ich wszystkich z ładnym ORDEREM na podstawie oświadczenia? Jak ograniczenie pierwszego rzędu, aby wpłynąć tylko na pierwszy wiersz ...

+1

Jeśli masz odpowiedź na swoje pytanie, zaakceptuj to. –

Odpowiedz

4

Coś takiego?

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 

sortuj wszystkie wyniki przez pole rok w tabeli B, który dostaje 2011, 2010, itd ... Wszelkie członkowie, którzy nie są wymienione w tabeli B będą miały zerową rok i porządek na dno Lista. Następnie sortuj według B.member nie będąc null - mysql wymusi ten wynik boolowski na liczbę całkowitą 1 lub 0, które można posortować, Więc posortuj malejąco, aby najpierw sortować wszystkie 1 (nie puste grupy B.).

+0

Prawie dostałem: ORDER BY (tableb.year IS NULL) ASC, (tableb.member IS NOT NULL) DESC. Wszystko jest w porządku, problem polega na tym, że najpierw chcę pobrać B.catA, a następnie B.catB. A także, jeśli to możliwe, chcę tylko najnowsze w catA i catB, po tym, że zamówienie nie ma znaczenia ... – joxxe

+0

Naprawiono: ORDER BY (CASE tableB.year KIEDY EKSTRAKT (ROK OD teraz()) TO 0 ELSE 1 END) ASC, tableA.id desc; – joxxe

0

oparciu o zasady Sortowanie:

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

Przypuszczam, że niektórzy użytkownicy są w tabeli A, które nie istnieją w B, tak że chcesz użyć 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

Można zawsze „zamów przez” jednak groteskowo skomplikowane swój select jest kupić umieszczenie elementów zbierania danych do tabeli pochodnej, wybierając z niego, i zamawianie przez wyniki. Coś jak ...

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 

Musisz tylko upewnić się, że wszystkie kolumny jesteś wybierając w każdym z zapytaniami wyjdzie to samo, albo radzić sobie z wartością NULL inaczej.

Powiązane problemy