从2个组合表中获取最后一个条目


Get last entry from 2 combines tables

我正在建立自己的论坛,我被一件事困住了:

我有两张表:

  1. Forum_Topics
  2. Forum_Replies

现在我想要一行5个最新的回复或新生成的主题。

我应该如何开始/制作我的查询?

编辑:我也应该看到最新主题的主题名称没有任何回复。得到最后5个有回复的话题很简单,但是得到没有回复的话题,我似乎找不到一个好的解决方案。

谢谢你的帮助!

例如,如果表Forum_Topics有以下字段:

Id
Timestamp
Name

其中Id是主键,Timestamp是一个包含条目日期和时间的文件(时间戳类型)。

和表Forum_Replies的字段:

Id
Id_User
Text
Id_Forum_Topics
Timestamp

其中Id是主键,Timestamp是一个包含条目日期和时间的文件(类型为时间戳)。

Id_Forum_Topics也可以通过外键约束与Forum_Topic.Id建立关系。字段Id_UserText在我的回答中没有使用,仅用于演示目的。

注意:时间戳的值可以是最后一次更新或创建时间,这取决于您的需要


没有回复的最新主题

通过你的评论,我明白你想要创建没有回复的最新主题。

要获得没有回复的最新主题,您需要查询没有回复的主题,然后对结果进行排序以获得最新的主题。

由于引擎的限制,这很难通过COUNT和JOIN实现。我知道的最好的解决方案是嵌套查询,像这样:

SELECT Id, Name FROM Forum_Topics
WHERE Id NOT IN
(
    SELECT Id_Forum_Topics AS Id FROM Forum_Replies
)

这里我们要求的是没有出现在回复主题列表中的主题。这是没有出现在有回复的主题列表中的主题列表。这是没有回复的主题。

当然,你可以使用ORDER BY和LIMIT来获取最近的数据:

SELECT Id, Name FROM Forum_Topics
WHERE Id NOT IN
(
    SELECT Id_Forum_Topics AS Id FROM Forum_Replies
)
ORDER BY Timestamp DESC
LIMIT 5

注意:以下是我在评论之前对问题的理解。


给定主题的最新回复

那么你可以这样查询:

SELECT Id, Id_User, Text, Timestamp FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
ORDER BY Timestamp DESC
Limit 5

上面的查询将返回Forum_Topics 中由Id THE_ID_YOU_ARE_LOOKING_AT标识的条目的5个最新回复。

你也可以创建一个Join:

SELECT Id, Id_User, Text, Timestamp FROM Forum_Replies
JOIN Formun_Topics ON Forum_Replies.Id_Forum_Topics = Forum_Topics_Id

当然还有对join的查询:

SELECT Id, Id_User, Text, Timestamp FROM Forum_Replies
JOIN Formun_Topics ON Forum_Replies.Id_Forum_Topics = Forum_Topics_Id
WHERE Forum_Topics.Id = THE_ID_YOU_ARE_LOOKING_AT
ORDER BY Forum_Replies.Timestamp DESC
Limit 5

请注意,这个方法完全取决于字段Timestamp值的正确性[您作为开发人员有权确保]。为了提供最新的条目,我们按降序对该字段使用ORDER BY(因为更新意味着更高的值),并使用LIMIT来设置我们想要的结果的最大数量。

如果没有包含条目日期和时间的字段,就没有可靠的方法来断言哪些条目是新的[有一些事情可以做,但是有字段更容易开发和理解]。


有最新回复的主题

这与我展示的第一个查询非常相似,只查询字段Id_Forum_Topics并且不限制其值(不要放置WHERE子句):

SELECT Id_Forum_Topics FROM Forum_Replies
ORDER BY Timestamp DESC
Limit 5

一个主题有多少个回复

你可以这样查询:

SELECT (*) FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT

既然你说"所以如果我做一个新的主题,没有人回复它不显示为一个新的主题"我想这可能是有用的,因为你可以用它来告诉如果一个主题没有回复(或只有一个,或少于5…等等)。


最新话题(无论回复)

通过在Forum_Topics中添加Timestamp,您可以以类似的方式获取最新主题,例如:

SELECT Id, Name FROM Forum_Topics ORDER BY Timestamp DESC LIMIT 20

上面的查询将为您提供最新的20个主题。


最后,我怀疑您希望它实现分页,如果是这样,您可以:

1)使用时间戳指示查询的起始点:

SELECT Id, Id_User, Text FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
AND Timestamp > START_TIMESTAMP
ORDER BY Timestamp DESC
LIMIT 5

其中START_TIMESTAMP是要检索结果的日期和时间。

2)设置偏移量为LIMIT:
SELECT Id, Id_User, Text FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
ORDER BY Timestamp DESC
LIMIT 10, 5

在这个例子中,我们说我们想要5个最新的条目(像往常一样),但是在10个最新的条目之后。

Select * from Forum_Replies left join Forum_Topics on Forum_Replies.topicId = Forum_Topics.id order by Forum_Replies.datefield desc limit 5.