Php 从2个表中获取最后一个条目
我正在建立自己的论坛,我被一件事困住了: 我有两张桌子:Php 从2个表中获取最后一个条目,php,mysql,forum,Php,Mysql,Forum,我正在建立自己的论坛,我被一件事困住了: 我有两张桌子: 论坛主题 Forum\u回复 现在,我想要一行5个最新的答复或新生成的主题 我应该如何开始/进行查询 编辑: 我还应该看到没有任何回复的最新主题的主题名。获取最后5个回复主题很简单,但是获取没有回复的主题,我似乎找不到好的解决方案 谢谢你的帮助 例如,如果您有包含以下字段的表论坛主题: Select * from Forum_Replies left join Forum_Topics on Forum_Replies.topicId =
论坛主题
Forum\u回复
谢谢你的帮助 例如,如果您有包含以下字段的表
论坛主题
:
Select * from Forum_Replies left join Forum_Topics on Forum_Replies.topicId = Forum_Topics.id order by Forum_Replies.datefield desc limit 5.
Id
Timestamp
Name
Id
Id_User
Text
Id_Forum_Topics
Timestamp
其中,Id
是主键,Timestamp
是具有条目日期和时间的字段(类型为Timestamp)
以及包含以下字段的表Forum\u repress
:
Id
Timestamp
Name
Id
Id_User
Text
Id_Forum_Topics
Timestamp
其中,Id
是主键,Timestamp
是一个具有条目日期和时间的字段(类型为Timestamp)
另外,Id\u Forum\u Topics
将通过外键约束与Forum\u Topic.Id
建立关系。我的回答中不使用Id\u User
和Text
字段,这些字段仅用于演示目的
注意:时间戳的值可以是最后一次更新或创建时间,具体取决于您的需要
没有回复的最新主题 根据您的评论,我理解您希望创建没有回复的最新主题 要获取没有回复的最新主题,您需要查询没有回复的主题,然后对结果进行排序以获取最新主题 由于引擎的限制,这很难通过计数和联接实现。我知道的最佳解决方案是嵌套查询,如下所示:
SELECT Id, Name FROM Forum_Topics
WHERE Id NOT IN
(
SELECT Id_Forum_Topics AS Id FROM Forum_Replies
)
SELECT (*) FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
在这里,我们询问的主题没有出现在回复主题列表中。这是没有出现在有回复的主题列表中的主题列表。这就是没有回复的主题
当然,您可以使用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
上面的查询将返回对论坛主题
中由Id
您正在查看的标识的条目的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
请注意,此方法完全取决于字段时间戳
[作为开发人员,您有权确保]值的正确性,并以降序提供我们在该字段上使用的最新条目(因为更新意味着更高的值)和设置我们想要的最大结果数的使用限制
如果没有带有条目日期和时间的字段,就无法可靠地断言哪些条目较新[您可以做一些事情,但拥有该字段更容易开发和理解]
最新回复的主题
这与我提出的第一个查询非常相似,只需查询字段Id\u Forum\u Topics
,不限制其值(不要放置WHERE子句):
一个主题有多少个回复
您可以这样查询:
SELECT Id, Name FROM Forum_Topics
WHERE Id NOT IN
(
SELECT Id_Forum_Topics AS Id FROM Forum_Replies
)
SELECT (*) FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
既然你说“如果我创建了一个新主题,但没有人回复,它就不会显示为新主题”,我想这可能会很有用,因为你可以用它来判断一个主题是否没有回复(或者只有一个,或者少于5个…等等)
最新主题(不考虑回复)
通过在论坛主题
中添加时间戳
,您可以以类似的方式获取最新主题,例如:
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) 将偏移设置为限制:
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个最新条目之后。例如,如果您有一个包含以下字段的表Forum\u Topics
:
Id
Timestamp
Name
Id
Id_User
Text
Id_Forum_Topics
Timestamp
其中,Id
是主键,Timestamp
是具有条目日期和时间的字段(类型为Timestamp)
以及包含以下字段的表Forum\u repress
:
Id
Timestamp
Name
Id
Id_User
Text
Id_Forum_Topics
Timestamp
其中,Id
是主键,Timestamp
是一个具有条目日期和时间的字段(类型为Timestamp)
另外,Id\u Forum\u Topics
将通过外键约束与Forum\u Topic.Id
建立关系。我的回答中不使用Id\u User
和Text
字段,这些字段仅用于演示目的
注意:时间戳的值可以是最后一次更新或创建时间,具体取决于您的需要
没有回复的最新主题
根据您的评论,我理解您希望创建没有回复的最新主题
要获取没有回复的最新主题,您需要查询没有回复的主题,然后对结果进行排序以获取最新主题
由于引擎的限制,这很难通过计数和联接实现。我知道的最佳解决方案是嵌套查询,如下所示:
SELECT Id, Name FROM Forum_Topics
WHERE Id NOT IN
(
SELECT Id_Forum_Topics AS Id FROM Forum_Replies
)
SELECT (*) FROM Forum_Replies
WHERE Id_Forum_Topics = THE_ID_YOU_ARE_LOOKING_AT
在这里,我们询问的主题没有出现在回复主题列表中。这是没有出现在有回复的主题列表中的主题列表。这就是没有回复的主题
当然,您可以使用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
注:以下是我在评论之前理解的问题的答案
对给定主题的最新回复
那你就可以这么做了