2012-12-18 126 views
2

我有posts表。每個帖子都有topic_id字段,該字段對應於topics表中適當的id字段。RIGHT JOIN不返回所有結果

我需要排序topicsdate_created字段在posts表中。

此外,每個主題都有forum_id,我需要僅顯示和排序主題與特定forum_id

我想是這樣的:

SELECT 
    topics.id, topics.title 
FROM 
    topics RIGHT JOIN posts ON topics.id = posts.topic_id 
WHERE 
    topics.forum_id = 1 
ORDER BY 
    posts.date_created DESC 

但並非每個主題都有與之相關聯的帖子。那些沒有任何職位的人不會被退回。

如何解決?

+0

無法篩選左側表在右連接在where子句因爲當過濾器被應用缺失的行會已經取代使用空行,空不等於任何值。結果是內連接。將有關'topics'表的過濾器移動到ON子句中。 –

+0

將篩選器帶回到哪裏 - 只有那些應用於外部表的請求才需要在ON子句中聲明。 –

回答

1

嘗試使用LEFT JOIN代替RIGHT JOIN

+0

同樣的結果 - 只有帖子的主題被返回,沒有的帖子被排除。 – Eleeist

+0

奇怪,我不知道! – berty

+0

這工作後,一些擺弄。謝謝。 – Eleeist

1
SELECT 
    topics.id, topics.title 
FROM 
    (topics RIGHT JOIN posts ON (topics.id = posts.topic_id)) 
WHERE 
    topics.forum_id = 1 
ORDER BY 
    posts.date_created DESC 

試試這個

+0

這個,但用'LEFT JOIN'解決了這個問題。你們兩個幾乎都在那裏:)。 – Eleeist

+1

*「添加幾個括號」*如何幫助解決問題?這個查詢完全等同於OP的原始嘗試。 @Vaibhav刪除括號,你會看到左連接做的伎倆,而不是這個。 – Tomalak

0

也許失去了行,因爲沒有對職位沒有數據。嘗試投空值,像這樣IFNULL函數:

SELECT 
    topics.id, topics.title 
FROM 
    topics LEFT JOIN posts ON topics.id = posts.topic_id 
WHERE 
    topics.forum_id = 1 
ORDER BY 
    ifnull(posts.date_created, '1900-01-01 00:00:00') DESC