gpt4 book ai didi

sql - Rails 中 WHERE 子句中的 ALL 运算符

转载 作者:行者123 更新时间:2023-11-29 12:09:23 24 4
gpt4 key购买 nike

关联如下图。

InstructorStudent has_many :fees

Fee belongs_to :instructor_student

我想获得在所有给定数组中都有每月详细信息的讲师学生。如果其中任何一个中不存在每月详细信息,则不应返回任何记录。

due_month = ["2017-01-01","2017-02-01",,"2017-03-01"]

以下是我尝试过的查询,我想获取属于所有给定的三个 due_month 的 InstructorStudent,如果任何月份没有数据,那么它应该返回 nil:

@fee_paid = 
InstructorStudent.first.joins(:fees).where("fees.monthly_detail =
ALL(ARRAY[?]::date[]) AND fees.course_type = ?", due_month.map{|i| i
},"per month");

编辑 1:

@erwin-brandstetter 这是我的最终查询

InstructorStudent.where("
instructor_students.Id IN (?)",Instructor.find(17).per_month_active_student
).joins(
"INNER JOIN fees ON fees.instructor_student_id = instructor_students.id LEFT OUTER JOIN fee_payment_notifications ON fee_payment_notifications.fee_id = fees.id"
).where(
"fee_payment_notifications.status <> ? AND
fees.monthly_detail = ANY(ARRAY[?]::date[]) AND
fees.course_type = ? AND
fees.payment_status <> ?"
, 'Paid',dueMonth,"per month", "Due"
).group(
'fees.instructor_student_id'
).
having(
'count(*) = ?', dueMonth.length
)

协会:

InstructorStudent has_many Fees
Fee belongs_to instructor_student

Fee has_many fee_payment_notifications
FeePaymentNotifications belongs to fee

这是我为获取讲师学生所做的工作。其中有 fees.monthly_detail 存在于 dueMonth 数组中,fees.payment_status 是“到期”,Fees.course_type 是“每月” fee_payment_notifications 不应为“已支付”。

并不强制要求始终存在 fee_payment_notifications。 所以,如果 fee 有 fee_payment_notifications 而不是只有它应该检查它的状态。 如果没有任何 fee_payment_notifications 则应该获取记录。如果有任何 fee_payment_notifications 且状态为“已支付”,则不应获取记录。

最佳答案

这是 的情况.

实际的表定义(标准的 1:n 关系,被 Ruby ORM 隐藏)将是这样的:

CREATE TABLE instructor_student (
id serial PRIMARY KEY
name ...
);

CREATE TABLE fees (
id serial PRIMARY KEY
, instructor_student_id integer NOT NULL REFERENCES instructor_student
, course_type ...
, monthly_detail date
, UNIQUE (instructor_student_id, course_type, monthly_detail)
);

您的查询尝试有效地尝试针对给定数组中的多个值测试 fees 中的每一行,这总是失败,因为数组的元素不相同. 一个 值不能与多个 其他值相同。您需要一种不同的方法:

SELECT instructor_student_id
FROM fees
WHERE course_type = ?
AND monthly_detail = ANY(ARRAY[?]::date[]) -- ANY, not ALL!
GROUP BY instructor_student_id
HAVING count(*) = cardinality(ARRAY[?]::date[]);

这是假设您的数组中有 distinct 值,并且您的表费用中有唯一条目,就像我在上面添加的 UNIQUE 约束强制执行的那样。否则,计数不可靠,您必须使用更复杂的查询。这是一个选项库:

如您所见,我根本没有涉及表instructor_student。虽然引用完整性是通过 FK 约束强制执行的(就像通常那样),但我们可以单独使用 fees 来确定合格的 instructor_student_id。如果您需要从主表中获取更多属性,请在第二步中执行此操作,例如:

SELECT i.*  -- or whatever you need
FROM instructor_student i
JOIN (
SELECT ... -- query from above
) f ON f.instructor_student_id = i.id
;

关于sql - Rails 中 WHERE 子句中的 ALL 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44816759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com