2013-12-12 58 views
2

我對此很新,但我正在嘗試5個選擇題的測驗。每個問題有4個選擇。 我在數據庫中有問題和他們各自的答案。我試圖隨機化問題和答案,因此每次用戶參加測驗時都會顯示不同的問題。如何在查詢中選擇特定的值加上額外的隨機值?

這裏是我的代碼:

$qquery = "SELECT question from questions order by rand() limit 1"; 
$question = getvalue($qquery); 


$aquery = "SELECT (SELECT answer from questions where question = '$question') 
as right_ans, (select answer from questions where question != '$question') 
order by rand() limit 4"; 

的的GetValue(查詢)函數返回的問題串。我正在使用它來爲數據庫找到正確的答案。該函數還運行查詢並顯示結果。我的第二個查詢不起作用。我將不勝感激任何意見。謝謝!

+0

請顯示您的表架構和示例數據。看起來規範化是有序的。 – peterm

+0

你只是想隨機化問題,然後拿走它們並在第二個查詢中搜索該問題的答案吧? –

+0

是的,這就是我正在做的事情,但我希望將答案打印在隨機的位置上,並附帶3張我的表格的隨機答案。問題表: question_ID,question,answer,lesson_FK –

回答

1

試試這個新的,不知道,與MySQL工作或不。

$aquery = 
"SELECT TMP.ANSWER, TMP.RANDOM FROM ( 
SELECT ANSWER AS 'ANSWER', RAND() AS 'RANDOM' FROM QUESTION WHERE QUESTION = '$question' 
LIMIT 1 
UNION ALL 
SELECT ANSWER AS 'ANSWER', RAND() AS 'RANDOM' FROM QUESTION WHERE QUESTION != 'question' 
LIMIT 4 
) AS TMP 
ORDER BY TMP.RANDOM "; 
+0

哇謝謝!這使得它更容易,但是該查詢總是首先顯示正確的答案。當我在最後添加'rand by()limit 4'時,它會給我所有隨機結果,而不是正確的答案。真奇怪。它看起來像我添加'order by rand()'時,它只考慮聯合後的查詢。 –

+0

嘿,試試這個吧。 OMG! – Aditya

+0

OMG!謝謝Aditya!這樣可行!我只需要修改我的功能,以便它不顯示隨機數字:D –

0

根據您目前的模式,你可以嘗試使用一個查詢這樣

SELECT r.question, r.answer, q.answer wrong_answer 
    FROM 
(
    SELECT question, answer 
    FROM questions 
    ORDER BY RAND() 
    LIMIT 1 
) r JOIN questions q 
    ON q.question <> r.question 
ORDER BY RAND() 
LIMIT 4; 

輸出示例:

 
| QUESTION | ANSWER | WRONG_ANSWER | 
|-----------|---------|--------------| 
| question4 | answer4 |  answer9 | 
| question4 | answer4 |  answer11 | 
| question4 | answer4 |  answer7 | 

這裏是SQLFiddle演示

很明顯,你看問題和權利回答呃一次(例如從第一行開始),並從wrong_answer列中獲取其他3個錯誤答案,同時在php中遍歷結果集。


,或者你還可以去收拾錯誤的答案在分隔列表

SELECT question, answer, GROUP_CONCAT(wrong_answer) wrong_answer 
    FROM 
(
    SELECT r.question, r.answer, q.answer wrong_answer 
    FROM 
    (
    SELECT question, answer 
    FROM questions 
    ORDER BY RAND() 
    LIMIT 1 
) r JOIN questions q 
     ON q.question <> r.question 
    ORDER BY RAND() 
    LIMIT 3 
) q 

輸出示例:

 
| QUESTION | ANSWER |   WRONG_ANSWER | 
|-----------|---------|-------------------------| 
| question9 | answer9 | answer6,answer1,answer7 | 

這裏是SQLFiddle演示

然後在PHP你總是有單行結果集。你可以很容易地explode()wrong_answer值。

+0

謝謝彼得!但是這個查詢仍然始終在第一個位置設置正確的答案。我很欣賞鏈接到小提琴。我會一直在那裏亂搞,看看我能否弄清楚。 –

+0

無需在純SQL中執行此操作。你可以通過在PHP中使用'$ right_anwer_index = rand(1,4);'來輕鬆解決這個問題,同時讓你的頁面把賴特的回答放在這個位置。 – peterm

+0

謝謝彼得!我感謝所有的提示:)我很高興我找到了這個網站。 –