2

MySQL のみを使用して、3 つの質問 ID を選択し、それらを単一の挿入ステートメントの列データとして使用するにはどうすればよいでしょうか。

現在、次のステートメントを使用して、質問テーブルから 1 つのランダムなエントリを選択することにより、ゲーム テーブルに新しい行を挿入しています。

現在のテーブル:

 -------------------------------
| game | user_id | question_id |
 -------------------------------
| 1    | 1       | 10          |

現在の声明:

INSERT INTO game (user_id, question_id)
 SELECT u.id as user_id, q.id as question_id
 FROM user u, question q
 WHERE u.id =:uid
 AND q.category = :category
 ORDER BY RAND()
 LIMIT 1

ゲーム テーブル: 複数選択できるように列 opt_1-3 を追加しました

 -------------------------------------------------------
| game | user_id | question_id | opt_1 | opt_2 | opt_3 |
 -------------------------------------------------------
| 1    | 1       | 10          | 5     | 12    | 80    |
                                 ^       ^       ^
                               alternative wrong answers

これは、結果を反復処理し、2 つのクエリを使用して、PHP で実現できます。

SELECT id FROM question
WHERE category = :category
ORDER BY RAND()
LIMIT 3

$opts = array();
foreach($result as $r){
    $opts[] = $r->id;
}

INSERT INTO game (user_id, question_id)
 SELECT u.id as user_id, q.id as question_id, 
 // add the following line to the query posted previously
 $opt[0] AS opt_1,  $opt[1] AS opt_2,  $opt[2] AS opt_3
 ... 

純粋に MySQL を使用して同じ結果を達成できるかどうかを知りたいです。

4

1 に答える 1

1

これはあまりテストされていませんが、これは選択として機能する可能性があります。

rand() による注文は迅速ではないことに注意してください。これには、多数の質問がある場合に低速になる可能性のあるいくつかの相互結合が含まれます。

SELECT u.id as user_id, Sub1.aid, Sub1.bid, Sub1.cid
FROM user u, 
(SELECT a.id AS aid, b.id AS bid, c.id AS cid
FROM question a, question b, question c
WHERE a.category = :category
AND a.category = :category
AND a.category = :category
AND a.id != b.id
AND a.id != c.id
AND b.id != c.id
ORDER BY RAND()
LIMIT 1) Sub1
WHERE u.id =:uid
于 2013-02-18T16:19:12.090 に答える