0

如果这是重复,我很抱歉,但我找不到任何能真正回答我的问题的东西,因为它相当具体。

我正在使用 php 和 mysql 创建一个论坛,到目前为止一切都很好,但我想根据他们最近发布的日期对每个类别中的主题进行排序。

我的数据库结构是这样的:

Table: threads
Fields: name, f_id, t_id

Table: posts
Fields: author, date, post, t_id, p_id

线程具有线程的名称、它所在论坛的 f_id 以及它自己的自动递增线程 id。帖子有作者、日期、帖子、它所在线程的 t_id 以及自动递增的帖子 ID。为此,第二个帖子的 ID 将始终高于第一个帖子,即使帖子是在其间的另一个线程中发布的。

当我想显示特定论坛中的所有主题时,我的问题就出现了。我目前使用此代码:

$t_query = mysqli_query($link, "SELECT name, t_id FROM threads WHERE f_id = ".$f_id."");

echo "<table><tr><td>Name</td><td>Author</td><td>Date</td></tr>";
while($rowt = mysqli_fetch_array($t_query)) {
    $p_query = mysqli_query($link, "SELECT author, DATE_FORMAT(date, '%r on %c/%e/%Y') as date_f, p_id FROM posts WHERE t_id = ".$rowt['t_id']." LIMIT 1");
    echo "<tr><td><a href=\"../pages/post.php?t_id=",htmlentities($rowt['t_id']),"\">",htmlentities($rowt['name']),"</a></td>";
        while($rowp = mysqli_fetch_array($p_query)){
            echo "<td>",htmlentities($rowp['author']),"</td><td>",htmlentities($rowp['date_f']),"</td></tr>";
}
echo "</table>";

这一切都很好,除了我不能按日期排序,因为日期在帖子中,而我的第一个循环是从线程中抓取的。我需要完成的是一个连接,它将从帖子中获取最高 p_id 的日期,其中 t_id 等于线程中的 t_id。

重新阅读后似乎有点混乱,但我希望有人可以帮助我进行连接查询并调整我的 php.ini 文件。

谢谢,夏尔夫。

4

2 回答 2

2

您只需要加入分组并按最大值排序:

SELECT t.name, t.t_id FROM threads t
INNER JOIN posts p ON p.t_id = t.t_id
WHERE t.f_id = ID
GROUP BY t.name, t.t_id
ORDER BY MAX(p.date)

假设您在每个线程中至少有一个帖子,因为此查询不会找到空线程 - 为此,您需要使用外连接。

于 2013-01-10T07:08:52.560 回答
1

我假设您想按其中最新帖子的日期对线程列表进行排序,对吗?加入帖子两次,一次是最近的日期,第二次是为了确保其中不存在更新的帖子。例如...

SELECT t.name, t.t_id
FROM threads t
JOIN posts p1 ON (p1.t_id = t.t_id)
LEFT JOIN posts p2 ON (p2.t_id = t.t_id AND p2.p_id > p1.p_id)
WHERE p2.p_id IS NULL
ORDER BY p1.date;
于 2013-01-10T07:08:01.263 回答