0

こんにちは、私は現在一種のクイズ アプリケーションを開発しています。「Discover」セクションでは、人気のある最新の質問を取得します。しかし、それらを取得したら、質問が現在のユーザーによって既に回答されているかどうかも確認する必要があります。

これが私のテーブルです:質問:(media_idは主キー、player_idは質問の作成者です)

media_id - player_id - answer0 - answer1 - ...

回答: (media_id は主キー、player_id は質問に回答した人です)

media_id - player_id - result - ...

これは私がよくある質問を得る方法です:

select * from questions where order by popularity_count

編集: 私が達成したいことを例で示しましょう:

質問行:

media_id - player_id - answer0 - answer1
0123456    abc123      bla       bla
6543210    hjk789      lor       ips

回答行:

media_id - player_id - result
6543210    abc123      1

したがって、ユーザー「abc123」がよくある質問を受け取ると、結果は次のようになります。

media_id - player_id - answer0 - answer1 - is_answered
0123456    abc123      bla       bla       0
6543210    hjk789      lor       ips       1

問題は、クエリの結果に、現在のユーザーが質問に回答したかどうかを示す一時的な列が必要なことです。どうすればこれを達成できますか?

2 つのクエリを使用して、人気セクションの質問が既に回答されているかどうかを確認できます。最初に人気のある質問を取得してから、すべての質問に対して質問が回答されているかどうかを確認するだけですが、これは非常に効果的ではないようです。1 つのクエリだけでこれを達成するにはどうすればよいですか?

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

4

1 に答える 1

0

正規化されていないテーブル構造があるため、この問題に正しく取り組んでいないようです。

行ごとの回答を含む別のテーブルが必要です。

質問(id、media_id、player_id、質問)

回答(id、media_id、player_id、question_id、answer)

このようにして、次のように回答されていない質問を簡単に確認LEFT JOIN answersできます。questions

SELECT q.question, a.answer
FROM question q
LEFT JOIN answers a ON a.question_id = q.id
  AND a.media_id = q.media_id
  AND a.player_id = q.player_id

実際に見る

現在のクエリに列を追加するには、列を追加し、ステートメントをSELECT使用して、回答があったかどうかを確認します。CASE

SELECT ..., 
    CASE
        WHEN answer0 IS NOT NULL
            THEN 'Yes'
        ELSE 'No'
    END AS 'Answered'
FROM ...

アップデート

あなたの更新に基づいて、あなたは にしか参加していないようJOINですplayer_idJOINとの両方player_idを使用するつもりだと思いますmedia_id。あなたが提供したデータと、あなたが意図していると私が考えるものとの違いを見てください。

于 2012-11-28T15:47:40.967 に答える