2010-08-29 23 views
7

içine yerleştirilmiş SELECT'ten çoklu sütun döndürme Bunu yapmak için daha iyi bir yol var mı?CASE MySQL

SELECT subs. * , 
     CASE subs.member_type 
     WHEN 'member' THEN 
     (SELECT CONCAT_WS(' ', members.first_name, members.last_name) 
      FROM members 
      WHERE members.id = subs.member_id) 
     ELSE 
     (SELECT members_anon.username 
      FROM members_anon 
      WHERE members_anon.id = subs.member_id) 
     END AS fullname, 
     CASE subs.member_type 
     WHEN 'member' THEN 
     (SELECT members.email 
      FROM members 
      WHERE members.id = subs.member_id) 
     ELSE 
     (SELECT members_anon.email 
      FROM members_anon 
      WHERE members_anon.id = subs.member_id) 
     END AS email 
    FROM subs 
WHERE subs.item_id =19 
    AND subs.item_type = 'blog' 
LIMIT 0 , 30 

İdeal ilgili tablosundan ad ve e-posta döndü tek CASE bölümü var istiyorum.

cevap

4

Ben sol dış kullanırsınız hem masalarda katılır: Eğer, iki case cümle gerekir sizin resultset iki farklı sütunlar gerekiyorsa

SELECT subs. * , 
     CASE subs.member_type 
     WHEN 'member' THEN CONCAT_WS(' ', m.first_name, m.last_name) 
     ELSE ma.username 
     END AS fullname, 
     CASE subs.member_type 
     WHEN 'member' THEN m.email 
     ELSE ma.email 
     END AS email 
    FROM subs 
    LEFT OUTER JOIN members m on (m.id = subs.member_id) 
    LEFT OUTER JOIN members_anon ma on (ma.id = subs.member_id) 
WHERE subs.item_id =19 
    AND subs.item_type = 'blog' 
LIMIT 0 , 30 

, tek vaka dilek İlişkin.

+0

sayesinde iyi çalışıyor. Tamamen anladığımdan emin değilim - "LEFT OUTER", sadece ilgili parantez içindeki karşılaştırma "true" değerini değerlendirdiğinde yapılmış mı? –

+0

Aha! Sanırım şimdi anladım. Dava, SELECT bölümüne 'seçimler' ekler, yani eğer subs.member_type = 'member'' ise, SELECT biti: 'subs. *, M.username, m.email' olacaktır. Böylece ma üzerindeki 'SOL DIŞARI' yürütülür, ancak sonuç kümesine dahil edilmez. Sağ? Bunun, tüm * .id sütunlarının "primary_keys" olması nedeniyle herhangi bir performans etkisinin olmayacağını düşünüyorum. –

2

iki ayrı sütunlar işlemek için tek bir vaka ifadesini kullanamazsınız ...

Kullanım: Cevabınız için

SELECT s. *, 
      CASE s.member_type 
      WHEN 'member' THEN x.fullname 
      ELSE y.fullname 
      END AS fullname, 
      CASE subs.member_type 
      WHEN 'member' THEN x.email 
      ELSE y.email 
      END AS email 
    FROM SUBS s 
LEFT JOIN (SELECT m.id, 
        CONCAT_WS(' ', members.first_name, members.last_name) AS fullname, 
        m.email 
      FROM MEMBERS m) x ON x.id = s.member_id 
LEFT JOIN (SELECT ma.id, 
        ma.username, 
        ma.email 
      FROM MEMBERS_ANON ma) y ON y.id = s.member_id       
    WHERE s.item_id = 19 
     AND s.item_type = 'blog' 
    LIMIT 0 , 30