2011-01-11 8 views
15

Tabela whoMySQL SELECT CASE WHEN coś potem wracać zerowy

wid--name-------father---mother 
1----Daisy------David----Liza 
2----Jenny------Joe------Judy 
3----Meggy------Mike-----Manuela 
4----Sarah------Joe------Judy 
5----Chelsea----Bill-----Hillary 
6----Cindy------David----Liza  
7----Kelly------Joe------Judy 

Tabela ages

aid---whoid---age 
1-----1--------0 
2-----2--------0 
3-----3-------14 
4-----4-------30 
5-----5-------22 
6-----6-------17 
7-----1-------18 

Chcę tę listę jako wynik:

id---name------age 
1----Meggy-----14 
2----Cindy-----17 
3----Daisy-----18 (Selected data that bigger than 0) 
4----Chelsea---22 
5----Sarah-----30 
6----Jenny-----30 (Her age is 0 on ages table and Sarah's age with same father and mother) 
7----Kelly-----30 (No data on ages table and Sarah's age with same father and mother) 

Próbowałem tej kwerendy:

SELECT 
    *, 
    (CASE age 
     WHEN '0' THEN (
      SELECT age 
      FROM ages a 
      LEFT JOIN who w 
       ON w.wid = a.whoid 
      WHERE 
       w.father = father 
       AND 
       w.mother = mother 
      ORDER BY a.age DESC LIMIT 1 
     ) 
     ELSE age 
    END 
    ) AS newage 
FROM who 
LEFT JOIN ages 
    ON wid = whoid 
ORDER BY newage 

Co jest nie tak z tym?

Odpowiedz

21

CASE … WHEN NULL nigdy nie będzie pasował do niczego, a CASE NULL będzie zawsze odpowiadać klauzuli ELSE (który w przypadku zwraca age, i. E. NULL).

Użyj tego:

CASE COALESCE(age, 0) WHEN 0 THEN … ELSE age END 

Aktualizacja:

Należy również alias tabele i używać aliasów w opisach polu:

SELECT *, 
     CASE COALESCE(age, 0) 
     WHEN '0' THEN 
       (
       SELECT MAX(age) 
       FROM who wi 
       JOIN ages ai 
       ON  ai.whoid = wi.wid 
       WHERE wi.father = w.father 
         AND wi.mother = w.mother 
       ) 
     ELSE 
       age 
     END AS newage 
FROM who w 
LEFT JOIN 
     ages a 
ON  a.whoid = w.wid 
ORDER BY 
     newage 
+0

Dziękuję. Rozwiązano problem z zamawianiem, ale nadal występują problemy z wyborem prawidłowego wieku. – baturalpdincdari

+0

@baturalpdincdari: alias tabel. – Quassnoi

+0

To wszystko. Jeszcze raz bardzo dziękuję. – baturalpdincdari

0

ojciec i matka w twoja subselect prawdopodobnie jest pomylona z ojcem i matką w twojej zewnętrznej kwerendzie. A może pytałeś, dlaczego nie jest optymalna?

+0

Tak, to jest dokładnie mylone z ojcem i matką. Podzapytanie wybiera największy wiek z tabeli wiekowej zamiast "tego samego ojca i matki". Chcę tylko wybrać listę, którą utworzyłem, Nie ma znaczenia, jest optymalna, czy nie. – baturalpdincdari