SQL:从联接中收集右侧值
假设一个问题有许多标记,通过一个名为taggings的联接表。我这样做:SQL:从联接中收集右侧值,sql,mysql,left-join,outer-join,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 我想根据一个特定的标签名称,例如“piano”,对结
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
这是完全错误的-我得到的第一个结果甚至没有标记为“钢琴”。我认为我的问题是,我需要以某种方式对标记名进行分组,并对其进行排序测试:我认为对直接的tags.name进行排序是不起作用的,因为结果连接表的结构(如果我只对tags表进行简单的选择,它确实起作用),但我无法了解如何修复它
谢谢你的建议,马克斯
编辑-回复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。无论如何肯定越来越近了…可能是因为
tags.name='piano'
在标记时计算结果为NULL
。name
为NULL
。尝试合并(tags.name,”)=“piano”