2015-03-13 41 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