例如,我有1个问题和5个答案.
题:
5+5=?
Answer:
a. 3
b. 4
c. 5
d. 9
e. 10
Run Code Online (Sandbox Code Playgroud)
这是数据库中的示例数据
id | question | ans1 | asn2 | ans3 | ans4 | correctAns |
1 | 5+5 | 3 | 4 | 5 | 9 | 10 |
Run Code Online (Sandbox Code Playgroud)
我想随机化ans1,ans2,ans3,ans4和correctAns的输出.
可能吗?如果它是请指导我..谢谢
Alm*_* Do 10
结构说明
虽然这个问题可能很有趣,但用例和问题的答案以及提供的结构确实很糟糕.那是因为你被限制在一定数量的答案.这意味着:
NULL值(这里的N意思是答案数,如果是上面的话N=4)N答案 - 那么,是的,ALTER等待.这将为NULL所有其他问题产生更多-s.我建议改变你的结构.将答案存储在单独的表中,并将外键存储到父问题表中.这就足够了(而且,关于随机选择的问题会更容易解决)
问题解决方案
但是,涉及表结构的问题可能很有趣 - 在MySQL中,这些问题通过INFORMATION_SCHEMA元数据经典地解决.要仅使用SQL解决问题,您需要使用预准备语句.这是示例表:
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;
Run Code Online (Sandbox Code Playgroud)
如您所见,此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)
最好先获得结果并将其放入数组中,然后您可以轻松地将其洗牌,如下所示:
$query = "SELECT ans1, asn2, ans3, ans4, correctAns FROM table_name WHERE id=1";
$res = mysql_query($query);
$answers = mysql_fetch_array($res);
shuffle($answers);
Run Code Online (Sandbox Code Playgroud)
然后,$answers按照正常情况迭代.
你可以使用该shuffle功能。
使用类似于以下的代码:
$sql = "select ans1,ans2,ans3,ans4 from questions where id=$questionId";
$result = $mysqliconnection->query($sql);
$row = $result->fetch_assoc();
shuffle($row);
Run Code Online (Sandbox Code Playgroud)
现在,row 包含给定问题的经过排序的结果数组id。
| 归档时间: |
|
| 查看次数: |
1402 次 |
| 最近记录: |