是否可以在一行中选择随机列?

zeu*_*026 12 php mysql sql

例如,我有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

结构说明

虽然这个问题可能很有趣,但用例和问题的答案以及提供的结构确实很糟糕.那是因为你被限制在一定数量的答案.这意味着:

  • 所有问题都必须得到所有答案.如果某个问题应该只有2个答案可供选择,那么 - 是的,会有N-2个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)

现在,我假设列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;
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)


Ali*_*lah 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);
Run Code Online (Sandbox Code Playgroud)

然后,$answers按照正常情况迭代.


Osc*_*rez 2

你可以使用该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