SQL:从连接中收集右手值

时间:2010-04-13 11:37:19

标签: sql mysql left-join outer-join

假设一个问题有很多标签,通过名为taggings的连接表。我这样做了:

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执行此操作(它确实有效)如果我只是在标签表上做一个简单的选择)但我无法理解如何解决它。

感谢任何建议,max

编辑 - 回复Marcelo re 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。无论如何肯定越来越近......

1 个答案:

答案 0 :(得分:2)

tags.name = 'piano'NULL时,可能因为tags.name评估为NULL。试试COALESCE(tags.name, '') = 'piano'