2011-11-23 39 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