2015-03-13 36 views
0

我有一个主题和topic_comments表。我想加入他们两个。MySQL查询加入最新评论主题

+------------+ +------------+ 
| Topic  | | Comments | 
+------------+ +------------+ 
| id   | | parent_id | 
| title  | | content | 
| createdate | | createdate | 
| content | | creator_id | 
+------------+ +------------+ 

加入是在topic.id = topic_comments.parent_id。我想通过最新评论和最新评论createdate来显示该主题。而不是显示重复的主题。谁能帮我?

到目前为止,我有这样的:

select p.id, p.title, p.createdate, p.content, p.int_0 as reacties_total, p.char_1 as prio, p.char_0 as status, r.createdate as r_createdate, r.creator_id as r_creator_id, r.content as r_content 
from pages p, topic_reacties r 
where r.parent_id = p.id 
    and p.parent_id = ' . $this->id . ' 
order by p.int_2 desc 

然而,这没有按“T显示主题没有意见。它只会返回带有反应的主题。

+0

尝试LEFT OUTER JOIN topic_reacties R ON p.id = r.parent_id – 2015-03-13 08:29:17

+0

阅读联接。 – Strawberry 2015-03-13 08:30:09

回答

0
SELECT title,content,max(createdate) as createdate 
FROM topic 
left join comments 
on topic.id=comments.parent_id 
group by title 
order by createdate desc; 
0

要显示主题与最新评论,并按评论或每个主题排序是否有评论?这是两个不同的要求。

如果你想展示了最新的评论的主题,使用的连接,就像你做(除了请失去了古老的语法),但增加更多的细节,以on条款:

select p.id, p.title, p.createdate, p.content, 
     p.int_0 as reacties_total, p.char_1 as prio, 
     p.char_0 as status, r.createdate as r_createdate, 
     r.creator_id as r_creator_id, r.content as r_content 
from pages p 
join topic_reacties r 
    on r.parent_id = p.id 
    and r.createdate =(
     select Max(createdate) 
     from topic_reacties 
     where parent_id = r.parent_id) 
order by r.createdate; 

不要让子查询吓倒你。测试它,你会看到令人印象深刻的效率 - 如果createdate列索引。

如果你想全部主题无论他们有没有评论,但他们只有最新的评论,然后使用外部联接。您仍将使用相同的子查询,但某些DBMS不允许外连接的on子句中的子查询。例如Oracle。我不确定MySQL。无论如何,我总是将它移至where条款以保证安全。 (我处理很多不同的DBMS)。

但是,当您在where子句中检查外部联接的外部表时,可以将输出转换为与内部联接相同。所以你必须使用一些小技巧。

select p.id, p.title, p.createdate, p.content, 
     p.int_0 as reacties_total, p.char_1 as prio, 
     p.char_0 as status, r.createdate as r_createdate, 
     r.creator_id as r_creator_id, r.content as r_content 
from pages p 
left join topic_reacties r 
    on r.parent_id = p.id 
where (r.parent_id is null 
    or r.createdate =(
     select Max(createdate) 
     from topic_reacties 
     where parent_id = r.parent_id)) 
order by r.createdate; 

请注意,我已经放在括号/括号的where检查虽然,正如所写的,他们不是绝对必要的。但是,如果您添加其他支票,您需要将它们放在括号外。

where (r.parent_id is null 
    or r.createdate =(
     select Max(createdate) 
     from topic_reacties 
     where parent_id = r.parent_id)) 
    and p.ID = :SomeID 

退房的SQL Fiddle