我正在创建一个论坛应用程序的三个表:
boards
- 代表帖子的集合,is_deleted
boolean posts
- 代表一些文字以及一系列评论comments
- 代表一些文字我的目标是显示来自未标记为已删除的电路板的所有帖子的特定数量,按照对帖子的最后评论(然后在创建帖子时)排序。我必须执行的当前查询是:
SELECT
posts.*,
(SELECT created_date
FROM comments
WHERE comments.post_id = posts.id
ORDER BY comments.created_date DESC
LIMIT 1) as last_comment
FROM posts
JOIN boards ON boards.id = posts.board_id
WHERE boards.is_deleted = 0
ORDER BY
last_comment DESC,
posts.created_date DESC
LIMIT 4
OFFSET 0
效果很好,但我实际上并不需要last_comment
,除非我使用它来排序结果,所以我觉得我正在运行一个额外的SELECT,原因不多。有更好的方法吗?
更多地使用它,我相信我有一个不依赖于嵌套SELECT语句的查询:
SELECT
posts.*
FROM posts
JOIN boards
ON boards.id = posts.board_id
LEFT OUTER JOIN comments
ON posts.id = comments.post_id
WHERE
boards.is_deleted = 0
GROUP BY
posts.id
ORDER BY
comments.created_date DESC,
posts.created_date DESC
LIMIT 4
OFFSET 0
答案 0 :(得分:0)
当时没有更好的方法可以通过另一个选择语句来执行此操作。
您可以将select语句放在不同的位置,例如:
select p.*, com.created_date from posts p, comments com, boards b where b.id = p.board_id
and b.is_deleted = 0 and com.id in (select c.id from comments c where c.post_id = p.id
order by c.created_date desc limit 1) order by com.created_date desc, p.created_date desc
limit 4 offset 0;
查询规划器旨在优化where子句,因此如果可能,我将尝试仅在where子句中生成select语句。 如果您在没有第二个select语句的情况下执行此操作,那么只有在保存数据时将此信息存储在posts-table中,才能执行此操作。 那么你需要在posts-table中添加一个列,例如名称'last_comment',并将注释的创建时间放在该字段中。在这种情况下,您可以通过posts表中字段'last_comment'的顺序替换第二个语句。 但是,由于功能要求可能在将来发生变化,因此您更改了表格。我不建议你这样做。每个表或视图都是一个不同的对象,SQL会处理不断变化的功能需求。