0

サブクエリが必要だと思われるMySQLクエリがあります。多くのコメントのそれぞれに対する「賛成」投票の総数を数え、特定のユーザーが各コメントにすでに投票しているかどうかを判断したいと思います。

ここに私のテーブルがあります:

Comments Table:
  comment_id  comment      acct_id     topic_id    comment_date
      5        hello5        2             1            9:00am
      7        hello7        3             1           10:00am

  Votes Table:
  comment_id   vote        acct_id     topic_id
     5          1             1            1
     7          1             4            1
     5          1             5            1  

ここに私が得ている出力があります:

  comment_id  commenter  comment  voter   sum    did_i_vote 
      5           2      hello5     1      2          1 
      7           3      hello7     4      1          1

目的の出力は次のとおりです。

  comment_id  commenter  comment  voter   sum    did_i_vote 
      5           2      hello5   **5**    2          1 
      7           3      hello7     4      1          1

これが私のクエリです:

SELECT votes.acct_id as voter, comments.comment_id, comment, comments.acct_id as 
commenter, SUM(vote) as sum, vote as did_i_vote
from votes 
right join comments 
on votes.comment_id=comments.comment_id 
join accounts on comments.acct_id=accounts.acct_id 
where topic_id=1 
group by comments.comment_id order by comment_date desc  

これら 2 つの出力は、 を除いて同一であることがわかりますvoter

私のクエリに欠けているのは、特定のユーザー (たとえば、を使用)voter=acct_id=5がいずれかのコメントに投票したかどうかを判断する方法です。その条件がなければ、クエリはforがvoterであるリストの最初のものを選択します。comment_id=5voter=1

だから私の質問は、次のサブクエリを挿入する必要があると思います:

SELECT from votes where voter='X'

どこで、どのようにかわかりません。fromと上記の間に括弧を入れると機能がvotesなくなるsum()ので、行き詰まります。

何かご意見は?

4

1 に答える 1

1

上記のコメントからあなたを正しく理解していれば、votesもう一度テーブルをクエリに(外部で)結合するだけでよいと思います。今回は、問題のアカウントの投票についてのみです。

SELECT
   comments.comment_id       AS comment_id,
   comments.acct_id          AS commenter,
   comment                   AS comment,
-- votes.acct_id             AS voter,                        -- ambiguous
   SUM(votes.vote)           AS sum,
   my_votes.vote IS NOT NULL AS did_i_vote
FROM
             votes
  RIGHT JOIN comments ON votes.comment_id=comments.comment_id
        JOIN accounts ON comments.acct_id=accounts.acct_id    -- what purpose ?
  LEFT  JOIN votes AS my_votes ON
               my_votes.commentid=comments.comment_id
           AND my_votes.acct_id=@my_acct_id
WHERE topic_id = 1                                            -- ambiguous
GROUP BY comments.comment_id
ORDER BY comment_date DESC
于 2012-05-02T12:09:10.127 に答える