例如,我有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的输出。
有可能吗?如果它是请指导我..谢谢
答案 0 :(得分:10)
结构说明
虽然这个问题可能有趣,但用例和问题的答案以及提供的结构真的很糟糕。那是因为你被限制在一定数量的答案。这意味着:
NULL
个值(此处N
表示答案数量,如果超过N=4
)N
个答案 - 那么,是的,ALTER
等待。对于所有其他问题,这将产生更多NULL
- 。我建议改变你的结构。将答案存储在单独的表中,并将外键存储到父问题表中。这就足够了(而且,关于随机选择的问题会更容易解决)
问题解决方案
然而,涉及表结构的问题可能很有趣 - 在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)
答案 1 :(得分:5)
首先获得结果并将其放入数组中会更好,然后您可以轻松地将其洗牌,如下所示:
$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
。
答案 2 :(得分: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()
使用rand()的顺序使得行的顺序随机返回
更好的方式
更好的方法是将列结构更改为:
表问题:
| id | name |
表格anser:
| 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()
答案 3 :(得分: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
的问题。
答案 4 :(得分: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;