php – 可以在一行中选择一个随机列吗?

例如我有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个选择的答案,那么 – 是的,将有N-2个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和问题总是包含在第一和第二个结果中.其他列应随机分配.要做到这一点,可以使用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,ans1,correctAns,ans4,ans3 FROM test |
+---------------------------------------------------------------+
1 row in set (0.00 sec)

所以这可以很容易地在准备好的语句中使用.准备变量:

MysqL> set @s=(SELECT CONCAT('SELECT id,' 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)

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...