2

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

期望的结果:

我目前有一个完整的工作论坛,有多个类别,因为有多个类别我想创建一个概述页面,基本上说明最后一个线程,最后一个帖子,每个类别的作者和时间。

这是我的表格的结构

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

名称:forum_threads 字段:id、f_id、主题、作者、lastpost

名称:forum_posts 字段: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

有人有什么想法吗?

4

1 回答 1

1

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

除此之外,这有点偏离主题,我会提醒您不要使用诸如WHERE forums.id != 9 AND forums.id > 12. 相反,您应该在数据库中有一列 for disabled,并针对它进行查询。否则,您将面临无法维护的混乱局面。


作为对评论的回应,请尝试将此 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 进行比较。

于 2013-11-03T04:33:26.403 回答