2011-11-23 59 views
0

我有一個成員表,它具有各種其他表的外鍵。我正在檢查這些表中的每一個,看看一個成員是否有一個或多個記錄,如果他們返回一個值,如果不是,我返回0,這是全部選中的。除了在一個地方,這主要是工作。我需要檢查兩個表,如果其中任何一箇中有記錄,則查詢將返回5.0,否則返回。我正在嘗試使用UNION的SUM計數,但是我沒有得到我期望的結果,似乎只有兩個表中每個表中的第一條記錄被選中,就是這樣。在相關子查詢中求和計數的聯合

我正在使用(在一些幫助後)一系列與COUNT()和IF()相關的查詢來獲得總數。以下是查詢的一部分的樣子:

SELECT 
member_id, 
(SELECT IF(COUNT(member_id)>0,10,0) FROM tbl1 WHERE member_id = m.member_id) 
+ 
(SELECT IF(SUM(tbl_count) > 0,5,0) FROM 
    (
    SELECT member_id, COUNT(tbl2.id) as tbl_count 
    FROM tbl2 
    UNION ALL 
    SELECT member_id, COUNT(tbl3.id) as tbl_count 
    FROM tbl3 
) sub WHERE sub.member_id = m.member_id 
) 
as total 
FROM members m 

的實際查詢加入另外10頁左右的表,再次不工作是COUNT與聯盟SUM的唯一部分。任何人都可以建議我應該怎麼做?任何幫助將非常感激。非常感謝你。

回答

2

我認爲你正在尋找這樣的:

第一次嘗試(失敗)

SELECT 
member_id, 
(SELECT IF(COUNT(member_id)>0,10,0) FROM tbl1 WHERE member_id = m.member_id) 
+ 
(SELECT IF(SUM(tbl_count) > 0,5,0) FROM 
    (
    SELECT COUNT(*) as tbl_count 
     FROM tbl2 
    WHERE tbl2.member_id = m.member_id 
    UNION ALL 
    SELECT COUNT(*) as tbl_count 
     FROM tbl3 
    WHERE tbl3.member_id = m.member_id 
) sub 
) 
as total 
FROM members m 

第二個嘗試:

SELECT 
member_id, 
(SELECT IF(COUNT(member_id)>0,10,0) FROM tbl1 WHERE member_id = m.member_id) 
+ 
(SELECT IF(SUM(tbl_count) > 0,5,0) FROM 
    (
     SELECT member_id, COUNT(*) as tbl_count 
     FROM tbl2 
    GROUP BY member_id 
    UNION ALL 
     SELECT member_id, COUNT(*) as tbl_count 
     FROM tbl3 
    GROUP BY member_id 
) sub 
    WHERE sub.member_id = m.member_id 
) 
as total 
FROM members m 

如果查詢有10個可能加入你必須考慮重構... :-)

+0

嗨,謝謝你的迴應。這是我原來的,但我得到了錯誤「未知的列'm.member_id'在'where子句'」。我相信這是因爲帶有UNION的子查詢無法從子查詢中訪問別名表m。我仍然試圖通過這個工作,任何更多的意見,將不勝感激。 – TheMethod

+1

@TheMethod檢查第二次嘗試。我想基本上你會錯過你試圖的'group by'。 – DavidEG

+0

是的,謝謝你做到了!非常感謝您的時間和專業知識。當我獲得足夠的積分投票時,我一定會迴圈並且這樣做。再次感謝你。 – TheMethod