Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 根据另一个查询对MySQL查询进行排序?_Php_Mysql_Sorting - Fatal编程技术网

Php 根据另一个查询对MySQL查询进行排序?

Php 根据另一个查询对MySQL查询进行排序?,php,mysql,sorting,Php,Mysql,Sorting,我正在构建一些非常简单的论坛软件,作为对我的PHP和MySQL技能的一种自我测试,但我不太确定如何完成这项任务。我有一个名为Threads的表,其中包含所有线程的列表。我还有一个名为Posts的表,其中包含所有Posts。每个表的主键是一个自动递增ID。Posts中的每一行还包含它所属线程的ID 虽然我可以通过如下查询轻松检索某个子论坛中的所有线程: SELECT * FROM Threads WHERE ForumID='$forumid' SELECT * FROM Posts WHERE

我正在构建一些非常简单的论坛软件,作为对我的PHP和MySQL技能的一种自我测试,但我不太确定如何完成这项任务。我有一个名为
Threads
的表,其中包含所有线程的列表。我还有一个名为
Posts
的表,其中包含所有Posts。每个表的主键是一个自动递增ID。
Posts
中的每一行还包含它所属线程的ID

虽然我可以通过如下查询轻松检索某个子论坛中的所有线程:

SELECT * FROM Threads WHERE ForumID='$forumid'
SELECT * FROM Posts WHERE ThreadID='$threadid'
…我不知道如何根据每个帖子的最新帖子对其进行排序。我可以获得任何给定线程的帖子,如下所示:

SELECT * FROM Threads WHERE ForumID='$forumid'
SELECT * FROM Posts WHERE ThreadID='$threadid'
…但我不知道如何将这些数据合并到我的初始查询中进行排序。因为每个帖子都有一个唯一的ID,ID越高的帖子总是越新,所以没有必要比较日期或类似的事情。我只是不清楚如何实际进行查询


我很确定这在MySQL中是可能的,但如果不是,什么是最有效的PHP解决方案?谢谢

像这样的事情可以帮助你

SELECT DISTINCT t.* FROM Posts p LEFT JOIN Threads t ON p.ThreadID = t.id ORDER BY p.last_modified_time DESC


像这样的事情可以帮助你

SELECT DISTINCT t.* FROM Posts p LEFT JOIN Threads t ON p.ThreadID = t.id ORDER BY p.last_modified_time DESC


简单的JOIN语句是解决方案:

SELECT *
FROM Threads t
JOIN Posts p ON t.ThreadID = p.ThreadID
ORDER BY t.ModificationDate DESC -- or whatever column you want

这将为您提供所有线程的最新帖子。

一个简单的连接语句就是解决方案:

SELECT *
FROM Threads t
JOIN Posts p ON t.ThreadID = p.ThreadID
ORDER BY t.ModificationDate DESC -- or whatever column you want

这将为您提供所有线程的最新帖子。

请尝试使用
内部连接

SELECT p.*,t.*
FROM Threads t 
INNER JOIN Posts p ON t.id = p.ThreadID
ORDER BY
//whatever column you want like this p.date
p.date
DESC

使用
内部联接尝试此操作

SELECT p.*,t.*
FROM Threads t 
INNER JOIN Posts p ON t.id = p.ThreadID
ORDER BY
//whatever column you want like this p.date
p.date
DESC

所有给出的答案都非常接近,但我最终使用了以下查询:

选择t*
从线程t
t.id上的内部连接柱p=p.threadId
按t.id分组
按最大(p.id)说明订购

这是由于
重复
导致自动分组问题。有关该主题的更多信息,请参阅。

所有给出的答案都非常接近,但我最终使用了以下查询:

选择t*
从线程t
t.id上的内部连接柱p=p.threadId
按t.id分组
按最大(p.id)说明订购

这是由于
重复
导致自动分组问题。有关该主题的更多信息,请参阅。

您是否可以为
线程
帖子
表添加基本模式,以便我们也可以测试查询!我认为它应该按照子句的顺序与列组合一起工作。正确设计的join应该做到这一点,否则您将不得不求助于子查询。无论如何,这两种方法都有很好的文档记录。请参阅此链接中的第三个示例:@JakeKing-但是Posts表中应该有threadID。所以像@odiszpac写下来的那样加入他们,然后按t.id,p.id排序,我试过了,效果不错,但有一个问题。首先应用
ORDER BY
,然后
DISTINCT
删除重复项。但是,它从开头而不是结尾删除重复项,因此失败。有什么方法可以扭转这种行为吗?您可以添加
线程
帖子
表的基本模式,以便我们也可以测试查询!我认为它应该按照子句的顺序与列组合一起工作。正确设计的join应该做到这一点,否则您将不得不求助于子查询。无论如何,这两种方法都有很好的文档记录。请参阅此链接中的第三个示例:@JakeKing-但是Posts表中应该有threadID。所以像@odiszpac写下来的那样加入他们,然后按t.id,p.id排序,我试过了,效果不错,但有一个问题。首先应用
ORDER BY
,然后
DISTINCT
删除重复项。但是,它从开头而不是结尾删除重复项,因此失败。有没有办法扭转这种行为?非常接近,请看我对问题的评论。非常接近,请看我对问题的评论。