按桶分组(具有NULL值)

时间:2016-10-24 11:14:51

标签: mysql sql ruby-on-rails activerecord ransack

我有以下表格:

  1. 条目(id,title,text,duplicate_bucket_id)
  2. duplicate_buckets(id,comment)
  3. 因此每个条目都可以在一个重复的存储桶中。现在我想得到没有重复项的所有条目:

    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
    

1 个答案:

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