我需要创建一个查询来获取所有用户的问题以及每个问题,来自数据库的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
但这还没有结束,而且运作不佳。
答案 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
答案 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是第一个,因此问题位于第一个位置。这种方式更快,可管理,可读性更高。