在1个单一查询中获取问题和答案

时间:2012-07-10 20:39:25

标签: sql database

我需要创建一个查询来获取所有用户的问题以及每个问题,来自数据库的3个答案。此查询需要尽可能高效。

我有桌子:

questions:
  id
  user_id
  title
  date_created
  date_updated

answers:
  id
  question_id
  user_id
  body
  date_created

我可以在一个查询中完成吗?基本上我需要显示问题,与users表连接以获取用户名,显示问题的3个答案,并为每个答案显示海报的用户名。

我喜欢的是这样的:

SELECT questions.*, GROUP_CONCAT(answers.id) as answers 
  FROM (questions) 
  JOIN users ON users.id = questions.user_id 
  LEFT JOIN answers ON answers.question_id = questions.id 
 WHERE questions.user_id = '1' 
 GROUP BY questions.id 
 ORDER BY questions.date_updated desc 
 LIMIT 3

但这还没有结束,而且运作不佳。

3 个答案:

答案 0 :(得分:1)

我建议使用交叉应用...它会降低您正在使用的SQL服务器版本,但这里是一个示例查询。
如果您不确定问题是否有答案,请使用外部申请 如果您只想要答案问题,请使用交叉申请

SELECT
  q.id,
   q.[user_id],
   q.title,
   q.date_created,
   q.date_updated,
   ans.id,
   ....
FROM
  questions q
     CROSS APPLY
     (
     SELECT TOP 3
        a.id,
       a.question_id,
       a.[user_id],
       a.body,
       a.date_created
     FROM
       answers a
     WHERE
       q.id = a.question_id
     ) ans

see more here

答案 1 :(得分:0)

假设标题是问题而正文是答案,并且由于某种奇怪的原因,问题表中的id字段与答案表中的问题ID相关。要限制三个答案,您可能需要创建子查询。

SELECT title, FROM questions 
WHERE user_id IN 
(SELECT users.username, answers.body FROM users, answers WHERE 
 answers.user_id = users.user_id LIMIT 3); 

但是我会解决问题表中问题id被称为id的事实,不给外键提供与它相关的主键相同的名称是非常糟糕的做法。

答案 2 :(得分:0)

您可以尝试将数据库设计更改为:

post:
  id
  parent_id
  user_id
  title
  date_created
  date_updated

在此设计中,问题具有NULL parent_id。现在您可以进行如下查询:

select posts.* from
(
    SELECT id, parent_id, user_id, title, date_created, date_updated FROM post WHERE id = 67
    UNION ALL
    SELECT id, parent_id, NULL as user_id, NULL as title, NULL as date_created, NULL as date_updated FROM post WHERE parent_id = 67
) posts
Left JOIN users ON users.id = posts.user_id
WHERE posts.user_id = '1' 
ORDER BY posts.date_updated desc 
LIMIT 3

确保从数据库中提取数据时,NULL parent_id是第一个,因此问题位于第一个位置。这种方式更快,可管理,可读性更高。