2

有一个名为 m_techno_idea(存储想法)、m_techno_idea_moderator_vote(主持人投票)和 m_techno_idea_user_vote(用于用户投票)的表。用户投票只有 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 给了我正确的结果,但查询看起来不太好。我也尝试过 group by ,但它也没有帮助我。任何帮助将不胜感激。

尝试 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

这次尝试也给了我正确的结果。我不得不放置一个嵌套的子查询。如果有更好的解决方案,将不胜感激。

4

2 回答 2

0

为了实现这一点,“我只是想获得存储在两个不同表中的两个投票的总和”,请使用派生表。这是一般的想法。

select sum(votes) totalvotes
from (
select count(something) votes
from TheFirstTable
where whatever
union 
select count(something) votes
from TheSecondTable
where whatever ) ThisIsCalledADerivedTable

您可以将派生表放在一起以满足您的要求。

于 2013-10-14T13:12:02.847 回答
0

您的第二次尝试很好,除了您可以通过删除不必要的别名、使用一致的字母大小写和一些格式来清理它:

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
于 2013-10-14T13:24:30.073 回答