2012-01-28 14 views
3

ずに負と正の値の合計、以下のように、私は2つのテーブルを持っている:MySQLの合計サブクエリ

tbl_answers : id, (FK)authorID ... 

tbl_answer_votes : id, (FK)voterID, (FK)answerID, vote (sInt, only ever -1 or 1) 

tbl_answerstbl_answer_votesと一対多の関係を持っており、投票はマイナス1または正1.

のいずれかになります

tbl_answer_votestbl_answersに参加する必要がありますが、その回答のすべての否定投票の合計と回答のすべての肯定投票の合計を2つの別々の列として生成する必要があります。

私はこれをサブクエリで行うことができますが、それはより大きなクエリの小さな部分であり、サブクエリの落とし穴を読んだ後、投票テーブルからそれらの2つの負と正の合計を試してみたいと思います可能な限り効率的に

答えて

4

あなたはこれを達成するためにCASEJOINを使用することができます。

SELECT 
    a.id, 
    SUM(CASE v.vote when 1 then 1 else 0 end) as UpVotes, 
    SUM(CASE v.vote when -1 then 1 else 0 end) as DownVotes 
FROM 
    tbl_answers a 
INNER JOIN 
    tbl_answer_votes v 
ON 
    v.id = a.id 
GROUP BY 
    a.id 

これはtbl_answersからIDを返し、tbl_answer_votesからのどちらかの値の合計票を持つ2つの列を。どちらのテーブルからでも必要な他の列を指定していないので、列を追加するにはSELECTGROUP BY部分の列リストを調整する必要があります。

0

投票の合計と各回答の投票数を返すクエリを作成します。あなたは

positive votes = (count+sum)/2 
negative votes = (count-sum)/2 

を持って

sum of votes = positive votes - negative votes 
count of votes = positive votes + negative votes 

のでそうちょうどあなたのクエリにそれらの表現を追加します。何かのように

SELECT answerID, (COUNT(*)+SUM(vote))/2 as upvotes, 
       (COUNT(*)-SUM(vote))/2 as downvotes 
FROM tbl_answer_votes 
GROUP BY answerID 

のようになります。

1

私は時間がありません。しかし、ここであなたは少しそれをひねりかける必要があるかもしれません。

select a.id, SUM(CASE WHEN v.vote = 1 Then 1 ELSE 0 END), SUM(CASE WHEN (v.vote = -1) then 1 ELSE 0 end) 
from tbl_answers a 
inner join tbl_answer_votes v 
    On a.id = v.asnwerId 
where a.id = 123 
group by a.id