1

我有以下数据库结构。

问题表。

id  question               desc
1   What was john's age?   About john

选项表

id  question_id  option_value    correct_ans
1      1             20              0
2      1             18              0
3      1             28              1
4      1             60              0

现在我想从两个表中获取所有问题及其选项的记录。我想要以下结构。我做了代码并得到了结果,但它需要两个 sql 查询。首先从问题表中获取所有问题,然后创建一个数组,然后获取所有问题的选项并放入数组中。是否可以使用单个查询获取此类数据?

      array([0]=array('question_id'=>1,
                      'question'=>'what was john's age',
                      'desc'=>'About john',
                      'options'=>array([0]=>array('option_id'=>'1',
                                                  'option_value'=>20,
                                                  'correct_ans'=>0),
                                       [1]=>array('option_id'=>'2',
                                                  'option_value'=>18,
                                                  'correct_ans'=>0),
                                       [2]=>array('option_id'=>'3',
                                                  'option_value'=>28,
                                                  'correct_ans'=>1),
                                       [3]=>array('option_id'=>'4',
                                                  'option_value'=>60,
                                                  'correct_ans'=>0)
                                       )
                       ),
             [1]=array('question_id'=>2,
                        etc...............
4

1 回答 1

1

使用连接:

SELECT q.id question_id, question, desc, o.id option_id, option_value, correct_ans
FROM question q
LEFT JOIN option o
ON q.id = o.question_id
ORDER BY question_id, option_id

这使用了 LEFT JOIN,因此即使表中没有出现任何选项,您也将获得有关问题的信息(在这种情况下,表options中的列options将是NULL)。如果不允许这样做,您可以改用 INNER JOIN。

此查询的结果将重复每一行的问题信息。从结果创建数组的循环将必须检查 是否question_id已从上一行更改。如果有,则开始顶层数组的一个新元素;如果question_id相同,则添加到options当前数组元素的元素。

于 2013-08-03T07:09:23.010 回答