簡體   English   中英

Rails Activerecord關系:使用子查詢作為SQL連接的表

[英]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.

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