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

时间:2013-03-23 10:50:39

标签: php mysql forum

我正在建立自己的论坛而且我被困在一件事上:

我有两张桌子:

  1. Forum_Topics
  2. Forum_Replies
  3. 现在我想要一行包含5个最新回复或新生成的主题。

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

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

    感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

Id
Timestamp
Name

其中Id是主键,而Timestamp是具有条目日期和时间的字段(类型为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条最新回复。

您也可以加入:

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


最新主题(无论回复)

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

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

答案 1 :(得分:0)

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