1

假设一个问题有很多标签,通过一个称为标签的连接表。我这样加入:

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 执行此操作不起作用(它确实有效如果我只是在标签表上做一个简单的选择),但我不知道如何修复它。

感谢任何建议,最大

编辑 - 回复 Marcelo re COALESCE 非常感谢 Marcelo - 我以前没见过这个。必须更正确地阅读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。反正越来越近了……

4

1 回答 1

2

也许是因为tags.name = 'piano'评估为NULLwhen tags.nameis NULL。试试COALESCE(tags.name, '') = 'piano'

于 2010-04-13T11:43:51.557 回答