2012-04-17 4 views
1

質問とそれに対応するすべての回答を返すSQL文を作成しようとしています。下の例では、subject_idをハードコードしましたが、動的に設定されます。グループデータでの制限

結果を5つの質問に限定したいのですが、ちょうどLIMIT 5を追加すると、データ全体が私が望むものではない5に制限されます。

SELECT q.id,q.question,a.question_id,a.answer, a.correct 
FROM questions q 
JOIN answers a ON q.id = a.question_id 
WHERE q.subject_id = 18 
GROUP BY q.id,a.id 

私も何かを達成したいのですが、私はビジネスロジック(PHP)でそれを実装する方がよいかどうかはわかりません。私は、各質問(a.correct = 1)に正解を加え、正解(c = 0)をランダムに3つ返したいと思います。

答えて

2

最初の質問の場合、LIMITをサブクエリーの質問テーブルに個別に適用する必要があります。

SELECT q.id,q.question,a.question_id,a.answer, a.correct 
    FROM (SELECT * FROM questions q WHERE q.subject_id = 18 
      ORDER BY RAND() LIMIT 5) q 
    JOIN answers a on q.id = a.question_id 
GROUP BY q.id, a.id 
+0

お返事ありがとうございます。このソリューションは、常に同じ5つの質問(最初の5つ)を返す以外は問題なく動作します。私は毎回ランダムなものを返す必要があります。 RAND機能について読むことから、データベースには1万件を超える質問があるため、非常に遅い解決策になります。質問を制限し、毎回ランダムなものを返すより効率的なソリューションがありますか? – SteveF

+0

おそらく、このプログラム的な解決策が良いでしょう。どう思いますか? http://www.electrictoolbox.com/msyql-alternative-order-by-rand/ – SteveF

+0

10kは非常に多くの行ではありません(特に 'subject_id'で最初にフィルタリングするので)。あなたはそれを試してみて、どれだけ遅いかを見たいかもしれません。本当に速いランダム化が必要な場合は、ランダムidのクライアントサイドを次のようなソリューションで生成することができます。http://www.dasprids.de/blog/2008/06/07/fetching-random-rows-of-mysql-効率的にまた、ここで見て:http://stackoverflow.com/questions/2707717/how-do-i-select-a-random-record-efficiently-in-mysql – mellamokb