2012-08-10 71 views
1

我与这一个挣扎,即使有对堆栈溢出一些有点类似的问题,我无法找到合适的解决方案。我有三个表格:categories, topicsposts,我想加入它们并在categories中显示每个类别以及来自topics的最新主题的主题,其中包含发布内容以及最后发布的帖子从posts表中发布的最新日期。多获取最新的日期参加

我顺利得到的一切,显示一个类似我想只是我不能从每个类别获得最新帖子记录。

这里的查询:

SELECT c.cat_id, c.cat_name, c.cat_description, t.topic_subject, t.topic_id, p.post_date FROM categories c 
LEFT JOIN topics t ON c.cat_id = t.topic_cat 
LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = (SELECT MAX(post_date) as post_date FROM posts WHERE post_topic = t.topic_id) 
GROUP BY c.cat_id ORDER BY UNIX_TIMESTAMP(post_date) DESC 

我意识到它应该有东西WHERE条款中做了topic_id不是我要找的人。这样的其他人:

SELECT c.cat_id, c.cat_name, c.cat_description, t.topic_subject, t.topic_id, p.post_date FROM categories c 
LEFT JOIN topics t ON c.cat_id = t.topic_cat AND t.topic_id = (SELECT post_topic FROM posts ORDER BY UNIX_TIMESTAMP(post_date) DESC LIMIT 1) 
LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = (SELECT MAX(post_date) as post_date FROM posts WHERE post_topic = t.topic_id) 
GROUP BY c.cat_id ORDER BY UNIX_TIMESTAMP(post_date) DESC 

显然只会显示其中最新发布的类别的正确帖子。如何获得所有类别的最新帖子?

+2

主题表格是否具有字段post_date? – Thinhbk 2012-08-10 11:35:33

+0

nope,仅邮政表。他们都通过他们的ID连接,如cat_id = topic_cat和topic_id = post_topic – NewInTheBusiness 2012-08-10 12:00:58

回答

1
SELECT c.cat_id, c.cat_name, c.cat_description, tp.topic_subject, tp.topic_id, tp.maxPostDate 
FROM categories c 

LEFT JOIN (select t.topic_cat,t.topic_subject,t.topic_id, max(post_date) maxPostDate from topics t 
      LEFT JOIN posts p ON p.post_topic = t.topic_id 
      group by t.topic_cat,t.topic_subject,t.topic_id) tp 
on (c.cat_id=tp.topic_cat) 


where tp.maxPostDate = (select max(post_date) from topics t2 
         LEFT JOIN posts p2 ON p2.post_topic = t2.topic_id 
         where t2.topic_cat=c.cat_id 
         ) 


ORDER BY UNIX_TIMESTAMP(tp.maxPostDate) DESC 

注:此查询可以输出例如2行的一类,如果有相同的最大日期后2个不同的主题。

+0

辉煌!非常感谢......如果可能的话,本来会给你10张选票;) – NewInTheBusiness 2012-08-10 13:06:11

+0

但是为了输出两张,他们需要被发布到同一秒,对吧?不太可能... – NewInTheBusiness 2012-08-10 13:07:12

+0

是的,他们需要在相同时间戳的同一类别的不同主题中发布2篇文章。不可能的,但不是不可能的:) – valex 2012-08-10 15:01:41

0

第一:在你的选择查询必须使用一些agregate功能为您不要在GROUP BY子句中包括的字段。

现在。为了使用每个类别的最大时间戳获取帖子,您必须进行两步查询。在第一步中,您将获得类别的最大时间戳和第二个所有其他字段。是的,我们将使用cat_id + timestamp作为主键。它可以为同一个cat_id提供一些重复的记录,但这将是非常实时的事情。

的代码将类似于:

SELECT c.cat_id, MAX(p.post_date) as max_date 
into #tmp_table 
FROM categories c 
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    LEFT JOIN posts p ON p.post_topic = t.topic_id 
GROUP BY c.cat_id 

SELECT * -- what you'll need 
from #tmp_table as tmp 
    LEFT JOIN categories as c on c.cat_id = tmp.cad_id 
    LEFT JOIN topics t ON c.cat_id = t.topic_cat 
    LEFT JOIN posts p ON p.post_topic = t.topic_id AND p.post_date = tmp.max_date 
-- order by -- what you'll need 

这是一个解决方案, 更好的可能是好的。