按桶分组(具有 NULL 值)

Group by bucket (with NULL values)

我有以下表格:

  1. 条目(id、标题、文本,duplicate_bucket_id)
  2. duplicate_buckets (id, 评论)

所以每个条目都可以在一个重复的桶中。现在我想得到没有重复的所有条目:

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-clauses。所以查询变得非常复杂,我还不知道如何使用 Ransack Gem 进行这样的查询...

查询会很简单,如果每个 "entry" 都在 "duplicate_bucket" - 大小为 1 的桶中(我可以使用 *SELECT * FROM entries GROUP BY duplicate_bucket_id*).但是我想避免在 duplicate_bucket 中有条目,如果条目没有重复的话。是否有一个简单的查询(没有联合,没有子查询)来获取所有没有重复项的条目?

数据集

entries(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, 评论)

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

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)
;