ruby-on-rails – 返回重复记录(activerecord,postgres)
我有以下查询返回重复的标题,但是:id为nil:
Movie.select(:title).group(:title).having("count(*) > 1") [#<Movie:0x007f81f7111c20 id: nil,title: "Fargo">,#<Movie:0x007f81f7111ab8 id: nil,title: "Children of Men">,#<Movie:0x007f81f7111950 id: nil,title: "The Martian">,#<Movie:0x007f81f71117e8 id: nil,title: "Gravity">] 我尝试将:id添加到select和group但它返回一个空数组.如何归还整个电影记录,而不仅仅是标题? 解决方法
一种SQL-y方式
首先,让我们解决SQL中的问题,以便特定于Rails的语法不会欺骗我们. 这个问题非常明确:Finding duplicate values in a SQL Table KM的答案(从顶部开始,第二位,未经勾选,目前)符合您返回所有重复记录及其ID的标准.我修改了KM的SQL以匹配你的表… SELECT m.id,m.title FROM movies m INNER JOIN ( SELECT title,COUNT(*) AS CountOf FROM movies GROUP BY title HAVING COUNT(*)>1 ) dupes ON m.title=dupes.title INNER JOIN()内部的部分基本上就是你已经生成的部分.重复标题和计数的分组表.诀窍是将它加入未修改的电影表,这将排除任何在dupes查询中没有匹配的电影. 为什么在Rails中生成这么难?最棘手的部分是,因为我们正在将电影加入电影,所以我们必须创建表别名(m和dupes在我上面的查询中). 可悲的是,Rails没有提供任何声明这些别名的干净方法.一些参考: > Rails GitHub issues提到“加入”和“别名”.苦难. 幸运的是,既然我们已经掌握了SQL,我们可以使用.find_by_sql方法…… Movie.find_by_sql("SELECT m.id,m.title FROM movies m INNER JOIN (SELECT title,COUNT(*) FROM movies GROUP BY title HAVING COUNT(*)>1) dupes ON m.first=.first") 因为我们正在调用Movie.find_by_sql,所以ActiveRecord假设我们的手写SQL可以捆绑到Movie对象中.它不会按摩或产生任何东西,这可以让我们做别名. 这种方法有其缺点.它返回一个数组而不是ActiveRecord Relation,这意味着它不能与其他范围链接.而且,in the documentation for the
一种Rails-y方式 真的,上面的SQL是做什么的?它获得了不止一次出现的名称列表.然后,它将该列表与原始表匹配.所以,让我们使用Rails来做到这一点. titles_with_multiple = Movie.group(:title).having("count(title) > 1").count.keys Movie.where(title: titles_with_multiple) 我们调用.keys,因为第一个查询返回一个哈希.钥匙是我们的头衔. where()方法可以接受一个数组,并且我们已经传递了一系列标题.优胜者. 你可以说一行Ruby优于两行.如果那一行Ruby中嵌入了一个不成熟的SQL字符串,它真的有多优雅? 希望这可以帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |