【问题标题】:MySQL query sorting correct informationMySQL查询排序正确信息
【发布时间】:2013-11-03 04:03:25
【问题描述】:

我目前正在努力找出我想要实现的目标的正确查询,并且想知道是否有人有一些好主意。 在这里迷路了好几天,只是找不到正确的查询来获得我需要的东西。

期望的结果:

我目前有一个完整的工作论坛,有多个类别,因为有多个类别,我想创建一个概览页面,基本上说明每个类别的最后一个线程、最后一个帖子、由谁以及在什么时间。

这是我的表格的结构

名称:论坛 字段:id、名称

名称:forum_threads 字段:id、f_id、主题、作者、上次发帖

姓名: 论坛帖子 字段:id、t_id、帖子、作者、时间

实际问题

到目前为止,我已经收到查询,它显示了我想要的所有内容,除了一件事,它没有获取最新的主题主题,其他所有内容似乎都正确显示(注意我已禁用 forums.id 9 和超过 12 的所有内容,我不想显示这些结果。

SELECT forums.id, t.id AS thread_id,
   t.subject,
   t.forum_id,
   t.author, t.lastpost,
   u1.name AS author_name, u1.avatar AS author_avatar,
   u2.name AS lastpost_name, u.avatar AS lastpost_avatar
    COUNT(p.id) AS postscount,  COUNT(DISTINCT (t.id)) AS threadscount,
   forums.name,
   max(p.time) last_post_date
FROM forum_threads t
INNER JOIN users u1 ON u1.id = t.author
INNER JOIN users u2 ON u2.id = t.lastpost
INNER JOIN forum_posts p ON p.t_id = t.id
INNER JOIN forums ON forums.id = t.forum_id
WHERE forums.id != 9 AND forums.id > 12
GROUP BY  forums.id
ORDER BY forums.id ASC, p.id DESC, last_post_date DESC

有人有什么想法吗?

【问题讨论】:

    标签: php mysql sql forum


    【解决方案1】:

    好吧,如果您检索的thread_id 是正确的,并且forum_threads 表上的subject 列包含您期望的主题,那么您的显示级别代码有问题,而不是您的询问。 (由于您将thread_id 从与t.subject 的同一行中提取,如果其中一个如您所愿,那么另一个也应该是正确的。)

    除此之外,这有点偏离主题,我提醒您不要使用诸如WHERE forums.id != 9 AND forums.id > 12 之类的构造。相反,您应该在数据库中有一个disabled 的列,并针对它进行查询。否则你就会有一个无法维护的烂摊子。


    作为对 cme​​ts 的响应,请尝试将此 SQL 块添加到您的 JOIN 子句中:

    INNER JOIN (SELECT t2.forum_id as forum_id, MAX(lastpost) as lastpost
        FROM forum_threads t2
        GROUP BY t2.forum_id) as latest_post_per_forum
      ON latest_post_per_forum.forum_id = t.forum_id
    

    这是您的WHERE 子句:

      AND t.lastpost = latest_post_per_forum.lastpost
    

    不幸的是,我目前没有方便的 MySQL 实例来测试我的语法,但要点应该很明显:在每个论坛的基础上提取最后一个帖子 ID,然后将每个线程的最后一个帖子 ID 与该 ID 进行比较.

    【讨论】:

    • 好吧,thread_id 链接到与主题相同的线程,只是它不是发布的最新线程。感谢关于偏离主题情况的输入,我会尽快解决这个问题一切准备就绪,这是为了防止某些论坛显示给未登录的用户。
    • 您有几个选择:您可以在应用程序端进行过滤,以便从整个结果集中选择具有最大 last_post_date 的线程(随着您的站点变得更加繁忙,这可能会变得昂贵)。您还可以添加一个子查询,这在 mysql 中对性能非常不利。您还可以在应用层进行第二次查询并传入应用层中的 ID 列表。我将在答案中添加一个子查询示例。
    • 非常感谢!在玩弄了您发布的内容之后,我设法修复了我想要的确切结果,尽管我还必须为我的计数进行单独的内部连接,但现在一切正常!会给你 kuddo 的,但需要更多的声誉才能这样做,所以如果有人可以代表我这样做,请为这个传奇做这件事 =)
    • 太棒了!乐意效劳。请记住,因为 MySQL 的查询计划器是下一个没用的东西,所以这不是性能的最佳查询。如果这是任何其他类型的数据库,则子查询作为 CTE 会更好。我还建议您将结果缓存一分钟左右,这样您就不会在每个页面视图上进行计算。
    • 抱歉回复晚了,是的,结果正在缓存中,直到有新的帖子/线程已经发布,再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    相关资源
    最近更新 更多