[英]Rails Activerecord Relation: using subquery as a table for a SQL join
有人可以幫我弄清楚如何在Rails中編寫以下SQL語句嗎?
SELECT * FROM shifts a
INNER JOIN (
SELECT shifts.date, shifts.time, max(shifts.barber_id) as 'barber_id'
FROM shifts
WHERE shifts.date = '2017-09-06' and shifts.is_free = true
GROUP BY shifts.date, shifts.time
) b
ON a.date = b.date AND a.time = b.time AND a.barber_id = b.barber_id
WHERE a.`is_free` = true AND a.date = '2017-09-06'
因為在子查詢和主查詢中where-conditional相同,所以我使用范圍如下:
scope :available, -> { where('shifts.is_free', true).where('shifts.date', '2017-09-06').order(date: :desc, time: :asc) }
我還創建了子查詢的范圍:
scope :grouped_shifts, -> { select("date, time, max(barber_id) as barber_id").group(:date, :time).available }
但我不知道如何將范圍鏈接到join方法。 我可以將其作為參數傳遞嗎? 像那樣:
scope :something, -> { joins(self.grouped_shifts).available }
還是我不應該在這種情況下使用范圍? 預先感謝您的幫助!
將您在問題中和在對問題的第一條評論中所說的話匯總在一起,我認為您正在嘗試這樣做:
理發師很多,每個都有很多班次。 每個班次都有一個日期和時間,每個理發師可能在任何給定的班次上都可用或不可用。
您想查找2017年9月6日的每個時隙至少有一個可用的理發師,該時隙中可用的理發師具有最大的id(按時隙排序)
這是您的操作方式:
Shift.where(date: '2017-09-06').where(is_free: true).order(:time).group(:time).maximum(:barber_id)
您不需要按日期分組,因為所有選擇的班次都將在同一日期。 如果您想將其擴展到表中的所有日期,則看起來像這樣:
Shift.where(is_free: true).order(:date, :time).group(:date, :time).maximum(:barber_id)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.