簡體   English   中英

SQL / ActiveRecord查詢多列上的多行

[英]SQL / ActiveRecord Query for Multiple Rows on Multiple Columns

假設我有兩個ActiveRecord模型(或SQL數據庫中的兩個表,如果你願意的話)。 我有一個User類和一個Poll類。 User has_many Polls 當用戶進行Poll ,會詢問他們是否喜歡applesbananascherries User對這些內容的響應記錄在一個布爾列中。

我很想知道哪些用戶已經采取了Polls並且他們在任何時候(不一定是在同一時間)回答他們喜歡applesbananascherries 換句話說,他們不需要在一次Poll說他們喜歡所有三種水果,他們只需Poll他們在某些時候喜歡這些東西,即他們需要說他們至少喜歡apples一個Pollbananas中的至少一個Poll ,並且cherries在至少一個Poll

以一般方式做這件事的正確方法是什么? ActiveRecord或SQL查詢都會有所幫助。

讓我們假設你的polls表有布爾列applesbananascherries 然后,對於每個用戶,您希望查看相應的輪詢並計算每個水果列上的聚合OR函數,僅保留每個水果返回true的行。

User.joins(:polls)
    .group('users.id')
    .having('BOOL_OR(polls.apples) = ? AND BOOL_OR(polls.bananas) = ? AND BOOL_OR(polls.cherries) = ?', true, true, true)

或者你的桌子看起來像這樣http://sqlfiddle.com/#!15/c0967/10

create table polls (userid char(10), pollid char(10), questionid char(10), response boolean);

insert into polls (userid, pollid, questionid, response)
values ('1','1','APPLES',true),
       ('1','1','BANANAS',false),
       ('1','1','CHERRIES',true),
       ('1','2','APPLES',false),
       ('1','2','BANANAS',false),
       ('1','2','CHERRIES',true),
       ('1','3','APPLES',false),
       ('1','3','BANANAS',true),
       ('1','3','CHERRIES',true),
       ('2','1','APPLES',false),
       ('2','1','BANANAS',false),
       ('2','1','CHERRIES',true),
       ('2','2','APPLES',false),
       ('2','2','BANANAS',true),
       ('2','2','CHERRIES',true),
       ('2','3','APPLES',false),
       ('2','3','BANANAS',false),
       ('2','3','CHERRIES',true),
       ('3','1','APPLES',true),
       ('3','1','BANANAS',false),
       ('3','1','CHERRIES',false),
       ('3','2','APPLES',false),
       ('3','2','BANANAS',true),
       ('3','2','CHERRIES',false),
       ('3','3','APPLES',false),
       ('3','3','BANANAS',false),
       ('3','3','CHERRIES',true),
       ('4','1','APPLES',false),
       ('4','1','BANANAS',false),
       ('4','1','CHERRIES',false),
       ('4','2','APPLES',true),
       ('4','2','BANANAS',true),
       ('4','2','CHERRIES',true),
       ('4','3','APPLES',false),
       ('4','3','BANANAS',false),
       ('4','3','CHERRIES',false)
;

在這種情況下,您可以創建一個臨時視圖,將用戶問題與真實響應分組,然后計算該視圖中的記錄,如下所示:

with counts as (
  select userid, questionid
  from polls
  where response = true
  and questionid in ('APPLES','BANANAS','CHERRIES')
  group by userid, questionid
  )
select userid
from counts
group by userid
having count(*) = 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM