有一个名为m_techno_idea(存储构思)的表,m_techno_idea_moderator_vote(版主投票)和m_techno_idea_user_vote(用于uservotes)。用户投票仅为1,而主持人投票在1-5之间,并存储在名为votes的列中。所以我需要得到总数。单个查询中的投票数。我不想要嵌套查询。
我的尝试:
尝试1:
SELECT
COUNT(DISTINCT TIUV.PK_ID) + IFNULL((SUM(TIMV.VOTES)),0) AS VOTES
FROM
M_TECHNO_IDEA TI
LEFT OUTER JOIN
M_TECHNO_IDEA_MODERATOR_VOTE TIMV
ON
TIMV.FK_TECHNO_IDEA_ID=TI.PK_ID
LEFT OUTER JOIN
M_TECHNO_IDEA_USER_VOTE TIUV
ON
TIUV.FK_TECHNO_IDEA_ID=TI.PK_ID
WHERE
TI.PK_ID=2
这里的distinct关键字帮助我为用户投票设置了不同的行,但是对于版主投票,我不能使用distinct,因为投票在很多行中都是相同的。这给了我错误的结果。
尝试2:
SELECT (select count(TIUV.PK_ID) FROM M_TECHNO_IDEA_USER_VOTE TIUV
WHERE TIUV.FK_TECHNO_IDEA_ID=2) +
(select sum(TIMV.VOTES) FROM M_TECHNO_IDEA_moderator_VOTE TIMV
WHERE TIMV.FK_TECHNO_IDEA_ID=2) AS VOTES
尝试2给我正确的结果,但查询看起来不太好。我也曾尝试过小组,但它也没有帮助我。任何帮助将不胜感激。
尝试3:
SELECT
COUNT(DISTINCT TIUV.PK_ID) + IFNULL(MODVOTES.VOTES, 0) AS VOTES
FROM
(SELECT
TIMV.FK_TECHNO_IDEA_ID, SUM(TIMV.VOTES) VOTES
FROM
M_TECHNO_IDEA_MODERATOR_VOTE TIMV
GROUP BY TIMV.FK_TECHNO_IDEA_ID) MODVOTES
LEFT OUTER JOIN
M_TECHNO_IDEA_USER_VOTE TIUV ON TIUV.FK_TECHNO_IDEA_ID = MODVOTES.FK_TECHNO_IDEA_ID
WHERE
TIUV.FK_TECHNO_IDEA_ID = 2
这种尝试也给了我正确的结果。我不得不放置一个嵌套的子查询。如果有更好的解决方案,我们将不胜感激。
答案 0 :(得分:0)
为实现这一目标,“我只想获得存储在两个不同表中的两张选票的总和”,使用派生表。这是一般的想法。
select sum(votes) totalvotes
from (
select count(something) votes
from TheFirstTable
where whatever
union
select count(something) votes
from TheSecondTable
where whatever ) ThisIsCalledADerivedTable
您可以将派生表放在一起以满足您的要求。
答案 1 :(得分:0)
你的第二次尝试是好的,除了你可以通过删除不必要的别名,使用一致的letter-casing和一点点格式来清理它:
SELECT
(SELECT COUNT(*) FROM M_TECHNO_IDEA_USER_VOTE WHERE FK_TECHNO_IDEA_ID = 2) +
(SELECT SUM(VOTES) FROM M_TECHNO_IDEA_moderator_VOTE WHERE FK_TECHNO_IDEA_ID = 2)
AS VOTES