所以我的查询的目标是:
获取30天前没有开会的所有单个用户的客户。
Client has_many :meetings, through: :contacts
虽然联系人在这里不太相关。
我的查询如下:
user.clients.where(is_dormant: false).joins(:meetings).distinct.where('meetings.actual_start_datetime <= ?', 30.days.ago).where.not('meetings.actual_start_datetime > ?', 30.days.ago)
产生这个SQL:
SELECT DISTINCT "clients".* FROM "clients" INNER JOIN "contacts" ON "contacts"."client_id" = "clients"."id" INNER JOIN "meetings" ON "meetings"."contact_id" = "contacts"."id" INNER JOIN "clients_users" ON "clients"."id" = "clients_users"."client_id" WHERE "clients_users"."user_id" = $1 AND "clients"."is_dormant" = $2 AND (meetings.actual_start_datetime <= '2016-12-31 20:29:08.972999') AND (NOT (meetings.actual_start_datetime > '2016-12-31 20:29:08.973484')) ORDER BY "clients"."name" ASC [["user_id", 1], ["is_dormant", "f"]]
但似乎只是忽略了where.not('meetings.actual_start_datetime > ?', 30.days.ago)
条款。如果我在没有该子句的情况下运行查询,它将返回完全相同的结果。
经过多天的讨论,似乎最简单的方法是让所有在30天或更久前召开会议的客户,然后从该阵列中减去在过去30天内开会的客户天,例如:
user_clients.without_recent_meetings - user_clients.with_recent_meetings
有没有办法在一个查询中执行此操作,因为这种方式意味着必须运行两次复杂查询?
答案 0 :(得分:0)
试试这个
user.clients.where(is_dormant: false).joins(:meetings).distinct.where('meetings.actual_start_datetime <= ? AND clients.id not in (select m.client_id from meetings m where m.actual_start_datetime>?)', 30.days.ago)