0

表 pcKeyword kwId | 关键词

表短语 kwId | 投票

表反短语 kwId | 投票

所以投票列是一个整数,我想为指定的关键字求和它是这样的:

示例关键字 | 12 | 47

直到现在我有这个但我不能正常工作:

    SELECT pcKeyword.kwId, pcKeyword.keyword, SUM( proPhrase.vote ) AS proVotes, SUM( contraPhrase.vote ) AS contraVotes
FROM pcKeyword
INNER JOIN proPhrase ON proPhrase.kwId = pcKeyword.kwId
INNER JOIN contraPhrase ON contraPhrase.kwId = proPhrase.kwId
GROUP BY pcKeyword.keyword ORDER BY pcKeyword.keyword ASC
4

1 回答 1

0

你可以试试:

SELECT kwId, keyword, proVotes, contraVotes
FROM pcKeyword
INNER JOIN ( SELECT kwId pid, SUM( vote ) proVotes  
             FROM proPhrase GROUP BY kwId )  p ON pid = kwId
INNER JOIN ( SELECT kwId cid, SUM( vote ) contraVotes
             FROM contraPhrase GROUP BY kwId ) c ON cid = kwId

这样,您只在派生表中进行一次分组,而不是太频繁!(通过将表分成它们的派生表,我还可以整理整个语法,因为现在列名在每个派生表表达式中都是唯一的。)

见这里: http ://sqlfiddle.com/#!2/70634/1

编辑

只是为了完整起见,这里是带有LEFT JOINs 的版本,并COALESCE()确保您在没有投票的情况下获得有意义的结果:

SELECT kwId, keyword, 
       COALESCE(proVotes,0) proVotes, 
       COALESCE(contraVotes,0) contraVotes
FROM pcKeyword
LEFT JOIN ( SELECT kwId pid, SUM( vote ) proVotes  
             FROM proPhrase GROUP BY kwId )  p ON pid = kwId
LEFT JOIN ( SELECT kwId cid, SUM( vote ) contraVotes
             FROM contraPhrase GROUP BY kwId ) c ON cid = kwId

SQLfiddle:http ://sqlfiddle.com/#!2/ec51cb/1

于 2013-08-26T15:12:48.273 回答