0

私は2つのテーブルを持っています:

 question(qid int,title varchar(100))

 answer(aid int,qid int,vote int,content varchar(4096))

Qid と aid が主キーです。

各質問にはいくつかの回答があり、各回答には投票数があります。

いくつかの質問qidを取り、質問にいくつかの回答がある場合、各質問の最大(投票)回答を見つける方法は?

元:

mysql> select * from question;
+-----+-------+
| qid | title |
+-----+-------+
|   1 | abc   |
|   2 | efg   |
|   3 | hij   |
|   4 | mn    |
+-----+-------+

mysql> select * from answer;
+-----+------+------+---------+
| aid | qid  | vote | content |
+-----+------+------+---------+
|  77 |    3 |   45 | mysql2  |
| 110 |    1 |   95 | good    |
| 122 |    1 |   78 | bad     |
| 123 |    1 |   34 | bad2    |
| 223 |    2 |   56 | book1   |
| 224 |    2 |   82 | book2   |
+-----+------+------+---------+

ここで、qid(1,2) を指定すると、次の結果が得られます。

+-----+------+------+---------+
| aid | qid  | vote | content |
+-----+------+------+---------+
| 110 |    1 |   95 | good    |
| 224 |    2 |   82 | book2   |
+-----+------+------+---------+

max(vote) 列だけでなく、完全なアンサー レコード (すべての列を含む) が必要です。

各質問の最良の回答(最大投票回答)を表示したいだけです。

MySQL で最高の SQL は何ですか?

ありがとうございました!


2013/1/7 更新:

answer存在する場合は、最高の 1 つ (最大投票数の回答)のみを表示したいと思います。@Brian Hoover からの回答は、MySQL の下でのみ正常に機能します。

おそらく、すべてのデータベースで正常に機能する SQL はありません。

4

5 に答える 5

1

これは 1 つの方法です。

SELECT answer.aid, answer.qid, answer.vote, answer.content
   FROM answer
   JOIN (
          SELECT qid, max(vote) vote FROM answer
          GROUP BY qid) AS max_answer
    ON answer.qid = max_answer.qid AND answer.vote = max_answer.vote
   where answer.qid in (1,2)
   GROUP BY answer.qid, answer.vote

SQL フィドル

この場合、同点はほぼランダムに解消されるため、1 つの questionID ごとに 1 つのレコードのみが表示されますが、同点の場合に選択された回答が一貫しているという保証はありません。

于 2013-01-05T15:19:14.060 に答える
1
SELECT a.* FROM answer a
INNER JOIN (
  SELECT qid, MAX(vote) AS max_vote
  FROM answer
  WHERE qid IN (1,2)
  GROUP BY qid) b
  ON a.qid = b.qid
  AND a.vote = b.max_vote

SQL フィドル

于 2013-01-05T15:20:21.783 に答える
0

これはあなたが望むことだと思います:

select a.*
from answer a
where a.qid in (1, 2) and
      a.vote = (select max(vote) from answer a2 where a2.qid = a.qid)

このバージョンは、どのデータベースでも機能します。これを標準 SQL で表現する方法は他にもあります。

select a.*
from answer a join
     (select a.qid, max(vote) as maxvote
      from answer a
      where a.qid in (1, 2)
      group by a.qid
     ) asum
     on a.qid = asum.qid and a.vote = asum.maxvote

whereサブクエリに制限を加えていることに注意してください。それ以外の場合、クエリは、回答のすべての行でグループ化を実行し、次に結合してからフィルタリングを実行する必要があります。

于 2013-01-05T15:14:55.887 に答える
0

このクエリを試してください:

select aid,qid,max(vote),content
from
(select a.aid aid,a.qid qid,a.vote vote,a.content content 
from question q join
answer a
on (a.qid = q.qid)
order by 3 desc) tbl
group by qid;
于 2013-01-05T15:16:35.497 に答える
0
select * from (
  select qid, aid ,vote
  from answers where qid  in ( 123, 456 ) 
  order by vote desc 
) aaa
group by qid

一部のレコードに同じ投票がある場合、これも機能します。

于 2013-01-05T15:59:44.313 に答える