我的SQL查询没有优化,看起来也不好看,请看看

时间:2013-10-14 12:41:55

标签: mysql sql

有一个名为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

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

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