按桶分组(具有 NULL 值)
Group by bucket (with NULL values)
我有以下表格:
- 条目(id、标题、文本,duplicate_bucket_id)
- 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)
;
我有以下表格:
- 条目(id、标题、文本,duplicate_bucket_id)
- 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)
;