gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:33:11 24 4
gpt4 key购买 nike

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

我有两张 table :

  • Forum_Topics
  • 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 中的条目的 5 条最新回复Id 识别 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 个......等)。

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

    通过拥有 TimestampForum_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 个最新条目之后。

    关于php - 从 2 个组合表中获取最后一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15585864/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com