SQL:选择父母及其子女

时间:2009-07-27 02:55:44

标签: sql sql-server

我确定这是一个常见的查询,但我不确定如何最好地表达它。

我有两张桌子:

Questions { Id, Text... }
Answers { Id, QuestionId, Text...}

我想检索问题及其答案的列表,以便结果显示如下:

  • 问题A.
    • 问题A的第一个答案
    • 问题A的第二个答案
    • 问题A的第3个答案
  • 问题B.
    • 问题B的第一个答案 ......等等。

假设问题表上有一些选择标准。

一种非常低效的方法是选择所有相关问题,然后为每个问题选择所有答案。另一种低效的方法是使用LEFT OUTER JOIN。

获得问题和答案的最有效,最简单的方法是什么?可以在一个查询中完成吗?

2 个答案:

答案 0 :(得分:2)

对于MySQL(不是MSSQL)这样的东西会起作用;

SELECT q.text, a.text
FROM questions q
LEFT JOIN answers a ON 
    q.quiestionid = q.id
GROUP BY q.id, a.id
ORDER BY q.id

如果你有任何问题,请告诉我。

答案 1 :(得分:1)

为什么你认为左连接效率低?你会得到一些关于多次回答的问题的重复数据,但这只是通过线路的几个额外字节,没什么可担心的。

给出的一个答案工作正常(在任何真正的sql引擎中,包括mssql,sqlite等,以及建议的mysql)但是是冗余的(它有一个不带主键的分组)反正得到重复)。因此,以下更简单和拼写错误的版本是好的和快速的:

SELECT q.id, q.text, a.id, a.text
  FROM questions q
  LEFT JOIN answers a ON a.questionid = q.id
 ORDER BY q.id

您的客户端代码必须在q.id发生变化时注意,以便按照您的需要“分层次”地分组和显示内容 - 如何操作取决于您使用的客户端语言,例如您在Python中使用itertools.groupby非常简单地执行它(在SQL服务器端不需要group by,但是你确实需要它在客户端,无论是使用像Python一样的语言提供的工具还是自己实现它,根据需要显示层次结构。