假设一个问题有许多标记,通过一个名为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

我想根据一个特定的标签名来排序结果,例如“piano”,这样piano就在顶部,然后按字母顺序排列所有其他标签。目前我正在使用此order子句:
ORDER BY (tags.name = 'piano') desc, tags.name

这是完全错误的-我得到的第一个结果甚至没有标记为“钢琴”。我认为我的问题是我需要以某种方式对标记名进行分组,并针对这一点进行排序测试:我认为,由于生成的联接表的结构(如果我只是在标记表上做一个简单的select,它就可以工作)的原因,对直标记名进行排序是行不通的,但我无法理解如何修复它。
谢谢你的建议,麦克斯
编辑-回复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

返回正确的结果。不过,我还是想选择问题标识。不管怎样,肯定是越来越近了。。。

最佳答案

可能是因为当tags.name = 'piano'NULL时,tags.name计算为NULL。尝试COALESCE(tags.name, '') = 'piano'

关于sql - SQL:从联接中收集右手值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2629143/

10-11 01:38