Rails技术问题:如何选取唯一label及其关联的任意ID
解决Rails中选取唯一Label并关联任意ID的问题
你遇到的问题核心在于DISTINCT的工作方式——它是对你查询的所有字段组合进行去重的。当你同时选择label和id时,哪怕label相同,只要id不同,这两行就会被判定为不同的记录,所以才会出现重复的Styling条目。
下面给你两种可行的解决方案:
方案1:使用GROUP BY(通用SQL方案)
通过按label分组,每个label只会保留一行记录,你可以用MIN(id)或MAX(id)来获取该分组下的任意一个id(这里以取最小id为例):
@questionnaireload = Questionnaire.group(:label).select(:label, 'MIN(id) AS id')
执行后,每个唯一的label只会对应一个id,不会出现重复的label条目。
方案2:使用PostgreSQL的DISTINCT ON(专属简洁方案)
如果你用的是PostgreSQL数据库,可以用它特有的DISTINCT ON语法,直接指定按label去重,保留该行的其他字段:
@questionnaireload = Questionnaire.select('DISTINCT ON (label) label, id').order(:label)
注意这里必须搭配order(:label),因为PostgreSQL要求DISTINCT ON的字段必须出现在ORDER BY的最前面,这样它会按label排序后,保留每个label的第一条记录。
补充:用pluck直接获取数组结果
如果你不需要ActiveRecord对象,只是需要[label, id]的数组组合,可以这样写:
unique_label_id_pairs = Questionnaire.group(:label).pluck(:label, 'MIN(id)')
返回的结果会是类似[["Closet", 4], ["Styling", 1], ["Freestyle", 5]]的数组,也能满足你获取唯一label和对应id的需求。
内容的提问来源于stack exchange,提问作者summu
相关产品推荐
相关产品推荐

