我正在尝试编写一个论坛网站,我想显示一个线程列表。每个线程都应附有关于第一个帖子(线程的“头部”)以及最后一个帖子的信息。我当前的数据库结构如下:
threads table:
id - int, PK, not NULL, auto-increment
name - varchar(255)
posts table:
id - int, PK, not NULL, auto-increment
thread_id - FK for threads
这些表也有其他字段,但它们与查询无关。我有兴趣查询threads
并以某种方式JOIN
使用,posts
以便在单个查询中获得每个线程的第一篇和最后一篇文章(没有子查询)。到目前为止,我可以使用多个查询来做到这一点,并且我将第一篇文章定义为:
SELECT *
FROM threads t
LEFT JOIN posts p ON t.id = p.thread_id
ORDER BY p.id
LIMIT 0, 1
最后一个帖子几乎相同,除了ORDER BY id DESC
。现在,我可以通过执行以下操作选择多个线程及其第一篇或最后一篇文章:
SELECT *
FROM threads t
LEFT JOIN posts p ON t.id = p.thread_id
ORDER BY p.id
GROUP BY t.id
但是我当然不能同时得到两者,因为我需要同时对两者进行ASC
排序DESC
。
这里的解决方案是什么?甚至可以使用单个查询吗?有什么办法可以改变我的表格结构来促进这一点?如果这不可行,那么您能给我什么提示来提高这种特殊情况下的查询性能?