Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从2个表中获取最后一个条目_Php_Mysql_Forum - Fatal编程技术网

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回复
  • 现在,我想要一行5个最新的答复或新生成的主题

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

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


    谢谢你的帮助

    例如,如果您有包含以下字段的表
    论坛主题

    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
    
    注:以下是我在评论之前理解的问题的答案


    对给定主题的最新回复 那你就可以这么做了