3

アクションと question_ids を含む mysql テーブルがあります。各アクションには、次のようなスコアが付いています。

     ACTION       | SCORE
downvote_question |  -1
upvote_question   |  +1
in_cardbox        |  +2

スコアが最も高い質問をクエリしたいのですが、わかりません。

http://sqlfiddle.com/#!2/84e26/15

これまでのところ、私のクエリは次のとおりです。

SELECT count(*), l1.question_id, l1.action 
FROM `log` l1
GROUP BY l1.question_id, l1.action

これにより、蓄積されたすべてのアクションを含むすべての question_id が得られます。

私が欲しいのはこれです:

QUESTION_ID | SCORE
     2      |   5
     1      |   4
     3      |   1
     4      |   1
     5      |   1

私はそれを理解できません-おそらくサブクエリ、JOINSまたはUNIONSが必要です...

4

3 に答える 3

2

多分あなたはこれを試すことができます。

SELECT  a.question_id, sum(b.score) totalScore
FROM   `log` a INNER JOIN scoreValue b
          on a.`action` = b.actionname
group by a.question_id
ORDER BY totalScore DESC

SQLFiddle デモ

于 2012-08-14T12:19:16.413 に答える
1

count(*) を sum(l1.score) に置き換える必要があります。これは、sum が group by ステートメントに基づいてすべての値を追加するためです。

SELECT sum(l1.score), l1.question_id, l1.action 
FROM `log` l1
GROUP BY l1.question_id, l1.action

一定のスコアを使用すると、SQL Fiddle で動作します (質問によるグループ化を使用):

SELECT 
sum(
  CASE WHEN l1.action = 'downvote_question' THEN -1 
  WHEN l1.action = 'upvote_question' THEN 1 
  ELSE 2 END
) score,
l1.question_id
FROM `log` l1
GROUP BY l1.question_id
于 2012-08-14T12:13:32.290 に答える
0
SELECT sum(SCORE), l1.question_id, l1.action 
FROM `log` l1
GROUP BY l1.question_id, l1.action

それはあなたがしたいことですか?

upd: fidel のコードには、スコアなどの列はありませんが、アクションでテーブルを作成しても問題ないと思います | スコアとそれを合計する(スコア)

于 2012-08-14T12:12:50.903 に答える