我有以下表格:
因此每个条目都可以在一个重复的存储桶中。现在我想得到没有重复项的所有条目:
SELECT MIN(id) FROM entries GROUP BY duplicate_bucket_id
此查询的问题在于它还将没有duplicate_bucket_id的所有条目分组到只有一个带NULL的条目。
所以我需要这样的东西
(SELECT MIN(id) FROM entries WHERE duplicate_bucket_id IS NOT NULL GROUP BY duplicate_bucket_id)
UNION
(SELECT id FROM entries WHERE duplicate_bucket_id IS NULL)
此查询为我提供了正确的结果,但ActiveRecord无法使用UNION。
或者,我可以将此查询与子查询一起使用:
SELECT * FROM entries WHERE duplicate_bucket_id IS NULL OR id IN
(SELECT MIN(id) FROM entries WHERE duplicate_bucket_id IS NOT NULL GROUP BY duplicate_bucket_id )
在此查询中,我必须在子查询中的AND外部放置其他where子句。所以查询变得非常复杂,我还不知道如何使用Ransack Gem进行这样的查询......
查询很简单,如果每个“条目”都在“duplicate_bucket”中 - 大小为1的桶(我可以使用* SELECT * FROM entries GROUP BY duplicate_bucket_id *)。但是我想避免在duplicate_bucket中有条目,如果条目没有重复。是否有一个简单的查询(没有联合,没有子查询)来获取没有重复项的所有条目?
条目(id,title,text,duplicate_bucket_id)
1, 'My title', 'Bla bla', 1
2, 'Hello', 'Jaha', 1
3, 'Test', 'Bla bla', 1
4, 'Foo', 'Bla', NULL
5, 'Bar1', '', 2
6, 'Bar2', '', 2
duplicate_buckets(id,comment)
1, 'This bucket has 3 entries'
2, 'Bar1 and Bar2 are duplicates!'
1, 'My title', 'Bla bla', 1
4, 'Foo', 'Bla', NULL
5, 'Bar1', '', 2
答案 0 :(得分:1)
ANSI / ISO SQL:
select *
from entries as e1
where not exists (select null from entries as e2 where e2.duplicate_bucket_id = e1.duplicate_bucket_id and e2.id < e1.id)
;
MySQL可怕,可怕,不好,语法非常糟糕
select *
from entries
group by coalesce(-duplicate_bucket_id,id)
;