在相关子查询中求和计数的联合
问题描述:
我有一个成员表,它具有各种其他表的外键。我正在检查这些表中的每一个,看看一个成员是否有一个或多个记录,如果他们返回一个值,如果不是,我返回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的唯一部分。任何人都可以建议我应该怎么做?任何帮助将非常感激。非常感谢你。
答
我认为你正在寻找这样的:
第一次尝试(失败)
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个可能加入你必须考虑重构... :-)
嗨,谢谢你的回应。这是我原来的,但我得到了错误“未知的列'm.member_id'在'where子句'”。我相信这是因为带有UNION的子查询无法从子查询中访问别名表m。我仍然试图通过这个工作,任何更多的意见,将不胜感激。 – TheMethod
@TheMethod检查第二次尝试。我想基本上你会错过你试图的'group by'。 – DavidEG
是的,谢谢你做到了!非常感谢您的时间和专业知识。当我获得足够的积分投票时,我一定会回圈并且这样做。再次感谢你。 – TheMethod