2014-02-19 62 views
12

例如,我有1個問題和5個答案。是否可以在一行中選擇一個隨機列?

問:

5+5=? 

Answer: 

a. 3 
b. 4 
c. 5 
d. 9 
e. 10 

下面是在數據庫中的樣本數據

id | question | ans1 | asn2 | ans3 | ans4 | correctAns | 
1 | 5+5  | 3 | 4 | 5 | 9 |  10  | 

我想隨機化ANS1的輸出,ANS2,ANS3,ANS4和correctAns 。

是否有可能?如果是請引導我..謝謝

+2

你可以抓住所有從MySQL的答案,告訴PHP顯示隨機一個用於該問題 –

+1

只需將它們全部放在1個數組中並將其拖動即可。 – Svetoslav

+0

提示:WHERE $ id = $ rand'將作爲查詢的一部分,您將隨機更改'$ rand'。 – Asim

回答

2

您可以使用shuffle函數。

使用類似如下的代碼:

$sql = "select ans1,ans2,ans3,ans4 from questions where id=$questionId"; 
$result = $mysqliconnection->query($sql); 
$row = $result->fetch_assoc(); 
shuffle($row); 

現在,row包含結果與給定id問題的改組陣列。

+0

關於這個PHP函數[Shuffle](http://php.net/shuffle)的更多信息。你給它一個數組作爲參數。這會將數組作爲旁註,這意味着它將修改源數組。 使用此「混洗」數組並使用您的模板/視圖打印出來並創建一個HTML表單。 – Newbi3

+0

這不起作用。首先你把結果放在一個數組中進行混洗。 – Mubo

+0

可能的重複http://stackoverflow.com/questions/9457029/shuffle-random-mysql-results – Mubo

6

最好是先拿到結果,並把它放在一個數組,然後你可以洗牌,很容易,像這樣:

$query = "SELECT ans1, asn2, ans3, ans4, correctAns FROM table_name WHERE id=1"; 
$res = mysql_query($query); 
$answers = mysql_fetch_array($res); 
shuffle($answers); 

然後,通過迭代$answers按正常。

+0

答案在簡單性和效率方面得到了PHP標籤的好處。 –

2

你可以抓住該問題的所有答案像

$query="SELECT ans1,ans2,ans3,ans4,correctAns FROM yourTable WHERE id=1"; 

然後就告訴PHP來顯示一個隨機的答案。

$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db"); 
$result = $mysqli->query($query); 
$row = $result->fetch_array(MYSQLI_NUM); 
$randomAnswer=$row[rand(0,4)]; 
echo $randomAnswer; 
3

對於純MySQL的答案:

SELECT ans FROM 
(SELECT ans1 as ans,questionid FROM questions) 
UNION 
(SELECT ans2 as ans,questionid FROM questions) 
UNION 
(SELECT ans3 as ans,questionid FROM questions) 
UNION 
(SELECT ans4 as ans,questionid FROM questions) 
UNION 
(SELECT correct as ans,questionid FROM questions) 
WHERE questionid = $questionid 
ORDER BY RAND() 

由蘭特的順序()使用使行的順序返回隨機

更好的辦法

更好方法是將您的列結構更改爲:

表問:

| id | name | 

表雁:

| question_id | answer | 

隨着數據:

id | name 
1 | 5+5 

question_id | answer 
1   | 4 
1   | 3 
1   | 9 
1   | 5 
1   | 10 

那麼你可以使用:

SELECT answer 
FROM answer 
WHERE question_id = $question_id 
ORDER BY RAND() 
+0

ORDER BY RAND()可能是一個非常糟糕的主意 - 在某些(大多數)條件下它可能非常緩慢。如果您決定走這條路線,那麼強烈建議您對您的表現進行基準測試,並模擬真實世界的數據集,因爲通常情況下,表格越大表現越好。通過應用程序邏輯對其進行隨機化或從先前選擇的列表中選擇特定的隨機標識符幾乎總是更快 – Steve

+2

如果出現多個選項問題,我不會太在意性能,每個問題可以有多少個答案。但是,儘管如此,謝謝! – Xeli

+2

完全同意,我不想從你的答案中拿走任何東西,但認爲它是有效的和有用的指出 - 特別是如果OP然後使用相同的方法,然後擴大應用程序,並開始在隨機選擇可能的問題訂單等 – Steve

10

結構注意到

雖然這個問題可能是有趣的是,與問題和提供的結構的答案的用例是非常糟糕的。那是因爲你被限制在一定數量的答案中。這意味着:

  • 所有的問題將得到所有的答案。如果有些問題應該只有2個供選擇,那麼答案 - 是的,會有N-2 NULL值(這裏N指的答案數,如果上述N=4
  • 如果只有一個問題,必須有更多的比N的答案 - 然後,是的,ALTER等待。對於所有其他問題,這將產生更多NULL -s。

我建議改變你的結構。將答案存儲在單獨的表格中,並用父母問題表的外鍵存儲。這將是足夠的(並且,除此之外,關於隨機選擇的問題會更容易解決)

問題的解決

然而,涉及表的結構問題可能是有趣的處理 - 在MySQL中,這些問題通過INFORMATION_SCHEMA元數據經典解決。要僅解決SQL的問題,您需要使用prepared statements。下面是示例表:

 
mysql> SELECT * FROM test; 
+------+----------+------+------+------+------+------------+ 
| id | question | ans1 | ans2 | ans3 | ans4 | correctAns | 
+------+----------+------+------+------+------+------------+ 
| 1 | 5+5  | 3 | 4 | 5 | 9 |   10 | 
+------+----------+------+------+------+------+------------+ 
1 row in set (0.00 sec) 

現在假設列idquestion作爲要在第一和第二位,導致總是包括在內。其他欄應該是隨機的。要做到這一點,你可以用INFORMATION_SCHEMA.COLUMNS表:

SELECT 
    CONCAT(
    'SELECT id, question, ', 
    GROUP_CONCAT(COLUMN_NAME), 
    ' FROM test') AS s 
FROM 
    (SELECT 
    COLUMN_NAME 
    FROM 
    INFORMATION_SCHEMA.COLUMNS 
    WHERE 
    TABLE_NAME='test' 
    AND 
    TABLE_SCHEMA='test' 
    AND 
    COLUMN_NAME NOT IN ('id', 'question') 
    ORDER BY RAND()) AS randCols; 

正如你所看到的,這個SQL會產生另一個SQL。結果將如下:

 
+---------------------------------------------------------------+ 
| s                | 
+---------------------------------------------------------------+ 
| SELECT id, question, ans1,ans2,correctAns,ans4,ans3 FROM test | 
+---------------------------------------------------------------+ 
1 row in set (0.00 sec) 

因此,您可以輕鬆地在準備好的語句中使用。準備變量:

 
mysql> set @s=(SELECT CONCAT('SELECT id, question, ', GROUP_CONCAT(COLUMN_NAME), ' FROM test') AS s FROM (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='test' AND TABLE_SCHEMA='test' AND COLUMN_NAME NOT IN ('id', 'question') ORDER BY RAND()) AS randCols); 
Query OK, 0 rows affected (0.01 sec) 

使用它聲明:

 
mysql> prepare stmt from @s; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

最後,執行它:

 
mysql> execute stmt; 
+------+----------+------------+------+------+------+------+ 
| id | question | correctAns | ans1 | ans2 | ans4 | ans3 | 
+------+----------+------------+------+------+------+------+ 
| 1 | 5+5  |   10 | 3 | 4 | 9 | 5 | 
+------+----------+------------+------+------+------+------+ 
1 row in set (0.00 sec) 
相關問題