2013-11-03 63 views
2

我目前正在努力寻找我想要实现的正确查询,并想知道是否有人有一些明智的想法。 已经在这里失去了很长一段时间,只是无法找到正确的查询来得到我所需要的。MySQL查询排序正确的信息

期望的结果:

我现在已经完全工作座谈会,与多个类别,因为这样的事实,有多个类别,我想作一个概述页面基本上说明最后一个线程,最后发表的帖子,由每个类别的人数和时间。

这里是我的表是如何构成的

名称:论坛 领域: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 

任何人有任何想法?

回答

1

好吧,如果thread_id你检索是正确的,并在forum_threadssubject列包含你期待的主题,那么在你的显示级别代码,而不是你的查询问题。 (由于您从t.subject的同一行拉thread_id,如果其中一个正确如您所料,另一个应该也是如此)。

除此之外,这是稍微偏离主题,我会提醒你反对使用诸如WHERE forums.id != 9 AND forums.id > 12的构建体。相反,您应该在数据库中有一列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,然后比较每个线程的l这就是我的邮政编号。

+0

那么thread_id链接到主题相同的线程,只是它不是最新的线程被张贴在 欣赏关于题外情况的输入,我会尽快解决这个问题,一切准备就绪,这是为了防止某些论坛显示给未登录的用户。 – user2949138

+0

您有几个选择:您可以在应用程序端进行过滤,以便从整个结果集中选择最大last_post_date的线程(随着您的网站变得更加繁忙,这可能会变得昂贵)。你也可以添加一个子查询,这在mysql中对于性能来说会很糟糕。您还可以在应用层执行第二次查询,并传入应用层中的ID列表。我将为答案添加一个子查询的例子。 – syrion

+1

非常感谢!在玩过你发布的内容之后,我已经设法解决了我想要的确切结果,我也必须为我的计数做一个单独的内连接,但现在一切正常。 会给你kuddo的,但需要更多的声誉才能这样做,所以如果任何人都可以代表我做这件事,请为此传奇=) – user2949138