首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化数据库查询

优化数据库查询
EN

Stack Overflow用户
提问于 2013-08-03 14:52:01
回答 1查看 135关注 0票数 1

我有以下的数据库结构。

问题表。

代码语言:javascript
复制
id  question               desc
1   What was john's age?   About john

选项表

代码语言:javascript
复制
id  question_id  option_value    correct_ans
1      1             20              0
2      1             18              0
3      1             28              1
4      1             60              0

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

代码语言:javascript
复制
      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...............
EN

回答 1

Stack Overflow用户

发布于 2013-08-03 15:09:23

使用联接:

代码语言:javascript
复制
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

这使用左连接,因此即使options表中没有出现任何选项(在本例中,options表中的列将为NULL ),您也可以获得有关该问题的信息。如果这是不允许的,您可以使用内部连接。

此查询的结果将重复每行的问题信息。根据结果创建数组的循环必须检查question_id是否与前一行相比发生了变化。如果有,则启动顶级数组的一个新元素;如果question_id相同,则添加到当前数组元素的options元素中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18030207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档