1

我正在建立自己的论坛,但我坚持一件事:

我有两张桌子:

  1. Forum_Topics
  2. Forum_Replies

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

我应该如何开始/进行查询?

编辑:我还应该看到没有任何回复的最新主题的主题名称。通过回复获取最后 5 个主题很简单,但是在没有任何主题的情况下获取主题,我似乎找不到一个好的解决方案。

谢谢你的帮助!

4

2 回答 2

1

例如,如果您有Forum_Topics包含以下字段的表:

Id
Timestamp
Name

WhereId是主键,并且Timestamp是一个字段(类型为时间戳),其中包含条目的日期和时间。

以及具有以下字段的表Forum_Replies

Id
Id_User
Text
Id_Forum_Topics
Timestamp

Id主键在哪里,Timestamp是一个字段(时间戳类型),其中包含条目的日期和时间。

Id_Forum_TopicsForum_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

上面的查询将返回5 个最新回复到Forum_TopicsId THE_ID_YOU_ARE_LOOKING_AT.

您也可以加入:

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

当然还有对该连接的查询:

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... 等)。


最新主题(无论回复如何)

通过Timestampin Forum_Topics,您可以以类似的方式使用来获取最新的主题,例如:

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

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


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

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 个最新条目之后。

于 2013-03-23T11:04:26.970 回答
0
Select * from Forum_Replies left join Forum_Topics on Forum_Replies.topicId = Forum_Topics.id order by Forum_Replies.datefield desc limit 5.
于 2013-03-23T10:59:34.187 回答