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。无论如何越来越接近...