2010-04-13 37 views
1

假設一個問題有很多標籤,通過一個稱爲標籤的連接表。按字母順序中的所有其他標籤SQL:從連接中收集右側值

SELECT DISTINCT `questions`.id 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 

我想根據特定標籤名訂購的結果,例如「鋼琴」,讓鋼琴是在頂部,那麼:我做了這樣加入。目前我使用這個命令子句:

ORDER BY (tags.name = 'piano') desc, tags.name 

這是會完全錯誤的 - 第一個結果我回來,甚至沒有在所有標有「鋼琴」。我認爲我的問題是,我需要以某種方式對標籤名稱進行分組,並對其進行排序測試:我認爲,針對直接tags.name執行此操作不起作用,因爲所生成的連接表的結構(它可以工作如果我只是在標籤表上做一個簡單的選擇),但我無法弄清楚如何解決它。

感激的任何建議,最大

編輯 - 回覆馬塞洛重新COALESCE 非常感謝馬塞洛 - 我從來沒有見過這個。必須更正確地閱讀api。 這確實有幫助,但前提是我也選擇了coalese子句。即,這:

SELECT DISTINCT `questions`.id 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 
ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name 

仍然給出虛假結果。但是,這個:

SELECT DISTINCT `questions`.id, COALESCE(tags.name,'') 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 
ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name 

返回正確的結果。我想仍然只是選擇問題ID。無論如何越來越接近...

回答

2

也許是因爲tags.name = 'piano'評估爲NULLtags.nameNULL。嘗試COALESCE(tags.name, '') = 'piano'