2011-01-11 28 views
15

Tabella whoMySQL SELECT CASE quando qualcosa per poi tornare nulla

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 

Tabella 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 

Voglio quella lista come risultato:

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) 

ho provato quella query:

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 

Cosa c'è di sbagliato in questo?

risposta

21

CASE … WHEN NULL sarà mai mai soddisfatta, e CASE NULL corrisponde sempre la clausola ELSE (che nel tuo caso ritorna age, i. E. NULL).

Utilizzare questa:

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

Aggiornamento:

È inoltre necessario alias le tabelle e utilizzare gli alias nelle descrizioni dei campi:

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

Grazie. Questo problema risolti nell'ordinamento, ma ha ancora problemi con la selezione dell'età corretta. – baturalpdincdari

+0

@baturalpdincdari: alias le tue tabelle. – Quassnoi

+0

Ecco fatto. Grazie mille ancora. – baturalpdincdari

0

Il padre e la madre la tua sottoselezione viene probabilmente confusa con il padre e la madre nella tua query esterna. O ti stavi chiedendo perché non è ottimale?

+0

Sì, è esattamente confuso con il padre e la madre. Sottoquery sta selezionando la più grande età da tavolo di età invece di "lo stesso padre e madre". Voglio solo selezionare la lista che ho scritto, non importa, è ottimale o no. – baturalpdincdari