Intereting Posts
Создание задания в Oracle с использованием DBMS_JOB Скопируйте таблицу (включая индексы) в postgres left join with без дубликатов записей, показывающих только 1 минимальное значение Конкатенация значений строк Как сделать SQL-запрос для последней транзакции для каждой учетной записи? Вычисленный столбец должен содержать строку Имя столбца поиска, имеющее определенное значение в таблицах в определенной базе данных Объединить значения двух строк с одним Соединение SQL в нескольких столбцах в одних и тех же таблицах Как импортировать файл SQL с помощью командной строки в MySQL? SQL Azure – поиск подстроки? MySQL: следует ли индексировать все столбцы в моей таблице? sp_send_dbmail прикреплять файлы, хранящиеся как varbinary в базе данных С помощью базы данных H2 я могу выполнить SQL-запрос на CSV-текст, прочитанный из Java-Reader, например StringReader? Как смоделировать (Java) Enum в базе данных (с SQL92)

ALL в выражении WHERE в Rails

Ассоциация показана ниже.

InstructorStudent has_many :fees Fee belongs_to :instructor_student 

Я хочу получить студента-инструктора, который имеет ежемесячные данные во всем заданном массиве. Если ежемесячные данные отсутствуют в любом из них, он не должен возвращать какую-либо запись.

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

Следующим является запрос, который я пробовал, я хочу получить InstructorStudent который принадлежит всем данным три due_month, если в каком-либо месяце нет данных, тогда он должен вернуть 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 

Вот что я делаю для обучения учеников-инструкторов. который имеет fee.monthly_detail, присутствующий в массиве dueMonth и fee.payment_status, является «Due», а Fees.course_type «в месяц», а fee_payment_notifications не должны быть «оплачены».

Не обязательно, чтобы всегда присутствовали fee_payment_notifications. Итак, если плата имеет fee_payment_notifications, а не только, она должна проверять ее статус. Если нет каких-либо fee_payment_notifications, чем запись должна быть получена. Если есть какие-либо fee_payment_notifications, а статус «Платный», то запись не должна быть выбрана.

Это случай реляционного деления .

Фактические определения таблиц (стандартная связь 1: n, скрытая ORM Ruby) будут примерно такими:

 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[]); 

Это предполагает различные значения в вашем массиве и уникальные записи в таблице, такие как принудительные ограничения UNIQUE я добавил выше. Else, подсчеты не являются надежными, и вам нужно использовать более сложный запрос. Вот арсенал опций:

  • Как фильтровать результаты SQL в отношении has-many-through

Как вы можете видеть, я вообще не привлекал instructor_student table.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 ; 

Вы можете просто преобразовать месяцы в класс Ruby Date и позволить ActiveRecord выполнять работу:

 due_month= ["2017-01-01","2017-02-01","2017-03-01"] fee_paid = InstructorStudent.joins(:fees).where("fees.monthly_detail" => due_month.map{|month| Date.parse month}, "fees.course_type" => "per month")