2011-01-11 11 views
15

Tabla whocaso cuando algo luego regresar nula

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 

Tabla MySQL SELECT 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 

Quiero esa lista como resultado:

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) 

he intentado consulta:

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 

¿Qué pasa con eso?

Respuesta

21

CASE … WHEN NULL nunca coincidirán con cualquier cosa, y CASE NULL siempre coincidirá con el ELSE cláusula (que en su caso vuelve age, i. E. NULL).

Utilice esta:

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

Actualización:

También es necesario poner un alias para las tablas y el uso de los alias en las descripciones de campo:

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

Gracias. Esto resolvió el problema de ordenar, pero todavía tiene problemas para seleccionar la edad correcta. – baturalpdincdari

+0

@baturalpdincdari: alias tus tablas. – Quassnoi

+0

Eso es todo. Muchas gracias de nuevo. – baturalpdincdari

0

El padre y la madre en su subselección probablemente se confunde con el padre y la madre en su consulta externa. ¿O estabas preguntando por qué no es óptimo?

+0

Sí, está exactamente confundido con el padre y la madre. Subconsulta selecciona la edad más grande de la tabla de edades en lugar de "el mismo padre y madre". Solo quiero seleccionar la lista que he escrito, No importa, es óptimo o no. – baturalpdincdari

Cuestiones relacionadas