[英]SQL / ActiveRecord Query for Multiple Rows on Multiple Columns
假設我有兩個ActiveRecord模型(或SQL數據庫中的兩個表,如果你願意的話)。 我有一個User
類和一個Poll
類。 User
has_many Polls
。 當用戶進行Poll
,會詢問他們是否喜歡apples
, bananas
和cherries
。 User
對這些內容的響應記錄在一個布爾列中。
我很想知道哪些用戶已經采取了Polls
並且他們在任何時候(不一定是在同一時間)回答他們喜歡apples
, bananas
和cherries
。 換句話說,他們不需要在一次Poll
說他們喜歡所有三種水果,他們只需Poll
他們在某些時候喜歡這些東西,即他們需要說他們至少喜歡apples
一個Poll
, bananas
中的至少一個Poll
,並且cherries
在至少一個Poll
。
以一般方式做這件事的正確方法是什么? ActiveRecord或SQL查詢都會有所幫助。
讓我們假設你的polls
表有布爾列apples
, bananas
和cherries
。 然后,對於每個用戶,您希望查看相應的輪詢並計算每個水果列上的聚合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.