2011-01-11 8 views
15

Bảng whoMySQL CHỌN TRƯỜNG HỢP KHI một cái gì đó sau đó trở về vô

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 

Bảng 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 

Tôi muốn rằng danh sách kết quả là:

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) 

tôi đã cố gắng truy vấn rằng:

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 

Có vấn đề gì với điều đó?

Trả lời

21

CASE … WHEN NULL sẽ không bao giờ phù hợp với bất cứ điều gì, và CASE NULL sẽ luôn luôn phù hợp với ELSE khoản (mà trong trường hợp của bạn trả về age, i. E. NULL).

Sử dụng này:

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

Cập nhật:

Bạn cũng cần phải bí danh bảng của bạn và sử dụng các bí danh trong các mô tả lĩnh vực:

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

Cảm ơn bạn. Điều này giải quyết vấn đề đặt hàng, nhưng vẫn có vấn đề với việc chọn tuổi chính xác. – baturalpdincdari

+0

@baturalpdincdari: bí danh các bảng của bạn. – Quassnoi

+0

Vậy đó. Cảm ơn bạn rất nhiều lần nữa. – baturalpdincdari

0

Người cha và mẹ trong subelect của bạn có thể bị nhầm lẫn với cha và mẹ trong truy vấn bên ngoài của bạn. Hay bạn hỏi tại sao nó không tối ưu?

+0

Vâng, nó hoàn toàn nhầm lẫn với cha và mẹ. Truy vấn con đang chọn độ tuổi lớn nhất từ ​​bảng tuổi thay vì "cùng cha và mẹ". Tôi chỉ muốn chọn danh sách tôi đã viết, Không quan trọng, nó có tối ưu hay không. – baturalpdincdari