結構注意到
雖然這個問題可能是有趣的是,與問題和提供的結構的答案的用例是非常糟糕的。那是因爲你被限制在一定數量的答案中。這意味着:
- 所有的問題將得到所有的答案。如果有些問題應該只有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)
現在假設列id
和question
作爲要在第一和第二位,導致總是包括在內。其他欄應該是隨機的。要做到這一點,你可以用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)
你可以抓住所有從MySQL的答案,告訴PHP顯示隨機一個用於該問題 –
只需將它們全部放在1個數組中並將其拖動即可。 – Svetoslav
提示:WHERE $ id = $ rand'將作爲查詢的一部分,您將隨機更改'$ rand'。 – Asim