2011-01-11 4 views
15

Tabelle whoMySQL SELECT CASE WHEN etwas DANN null

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 

Tabelle 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 

Rückkehr möchte ich diese Liste als Ergebnis:

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) 

Ich habe versucht, diese Abfrage:

Was ist daran falsch?

Antwort

21

CASE … WHEN NULL wird nie etwas passen, und CASE NULL wird immer passen die ELSE Klausel (die in Ihrem Fall gibt age, i. E. NULL).

verwenden:

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

Update:

Sie müssen auch Ihre Tabellen alias und die Aliasnamen in den Feldbeschreibungen verwenden:

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

Vielen Dank. Dies löste das Ordnungsproblem, hatte aber immer noch Probleme bei der Auswahl des richtigen Alters. – baturalpdincdari

+0

@baturalpdincdari: Alias ​​Ihre Tabellen. – Quassnoi

+0

Das ist es. Nochmal vielen Dank. – baturalpdincdari

0

Der Vater und die Mutter in Ihr Subselect wird wahrscheinlich in Ihrer äußeren Abfrage mit dem Vater und der Mutter verwechselt. Oder hast du gefragt, warum es nicht optimal ist?

+0

Ja, es ist genau mit dem Vater und der Mutter verwechselt. Die Unterabfrage wählt das größte Alter aus Alterstabelle statt "des gleichen Vaters und der gleichen Mutter". Ich möchte nur die Liste auswählen, die ich geschrieben habe, egal, es ist optimal oder nicht. – baturalpdincdari