我想编写一个论坛网站,我想显示一个线程列表。每个线程应该伴随有关于第一篇文章(线程的“头部”)以及最后一篇文章的信息。我目前的数据库结构如下:获取线程中的第一个和最后一个职位
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
ing,这样我就可以在单个查询中获得每个线程的第一个和最后一个帖子(没有子查询)。到目前为止,我能够使用多个查询做到这一点,我已经定义了第一篇文章是幸福:
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
排序同时。
这里有什么解决方案?甚至可以使用单个查询吗?有什么办法可以改变我的桌子的结构以促进这一点吗?如果这不可行,那么您可以给我什么提示以改善这种特定情况下的查询性能?
您可以将这两者联合在一起,只要您将每个都放在'()'中,以便它的'ORDER BY'只适用于它自己。或者你可以加入一个子查询,这将是高性能的。 –
我需要为_each_线程获取第一个和最后一个帖子,所以我不认为'UNION'会做到这一点。子查询可能会。我会等待并看到其他建议。 – Grampa