4

我需要进行一个查询来获取所有用户的问题,并且对于每个问题,从数据库中获取 3 个答案。此查询需要尽可能高效。

我有桌子:

questions:
  id
  user_id
  title
  date_created
  date_updated

answers:
  id
  question_id
  user_id
  body
  date_created

我可以在 1 个查询中完成吗?基本上我需要显示问题,与用户表连接以获取用户名,显示问题的 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

但这还没有完成,也不能很好地工作。

4

3 回答 3

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

在这里查看更多

于 2012-11-23T03:23:01.653 回答
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 排在第一位,这样问题就排在第一位。通过这种方式,它更快、更易于管理并且具有更高的可读性。

于 2012-07-11T00:58:13.937 回答
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); 

但是,我会修复 question_id 在您的问题表中被称为 id 的事实,不给外键提供与其相关的主键相同的名称是非常糟糕的做法。

于 2012-07-10T21:19:24.170 回答