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

时间:2014-02-19 08:30:44

标签: php mysql sql

例如,我有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的输出。

有可能吗?如果它是请指导我..谢谢

5 个答案:

答案 0 :(得分:10)

结构说明

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

  • 所有问题都必须得到所有答案。如果某个问题应该只有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)

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

如您所见,此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;