Tabelle who
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
Ich möchte 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 diese Abfrage versucht:
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
Was stimmt damit nicht?
CASE … WHEN NULL
wird niemals mit irgendetwas übereinstimmen, und CASE NULL
stimmt immer mit der ELSE
-Klausel überein (die in Ihrem Fall age
zurückgibt, d. h. NULL
).
Benutze das:
CASE COALESCE(age, 0) WHEN 0 THEN … ELSE age END
Update:
Sie müssen auch Ihre Tabellen als Aliasnamen verwenden 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
Der Vater und die Mutter in Ihrer Unterauswahl werden wahrscheinlich in Ihrer äußeren Frage mit dem Vater und der Mutter verwechselt. Oder haben Sie gefragt, warum es nicht optimal ist?