2010-04-13 48 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'