一个 User 表,一个 Order 表。 要做的是查询出在 一段时间内没有下单的用户 (一个 start_time,一个 end_time)。
我想过,要做肯定是先找没有下单的用户,然后在用两个时间来筛选下。
这应该用个子查询嵌套吧?
感觉条件有点绕..需要大家帮助,谢谢各位!
纯 SQL 的写法大概是这样的
select * from users where NOT EXISTS (select * from orders where orders.user_id = users.id and orders.shipped_at > start_time and orders.shipped_at < end_time)
#2 楼 @catherine
User.where("NOT EXISTS (select * from orders where orders.user_id = users.id and orders.shipped_at > ? AND orders.shipped_at < ?)", 2.months.ago, Time.now)
这样应该可以的,你试试
User.includes(:orders).where().not(orders: {created_at: start_time..end_time})
这样么?
#4 楼 @fate 我改了下,刚问的时候在外面用手机码出来的。为了方便就用 order 和 user(单词短...外面真冷手都僵硬了...),实际我本机的表是 transaction 和 consumer 表。 用你的改了下,达到效果了,感谢!
Consumer.where("NOT EXISTS (select * from transactions where transactions.Consumer_id = consumers.id and transactions.created_at > ? AND transactions.created_at < ?)", Time.now, Time.now)
再补一个供参考。
Consumer.where.not(id: Transaction.where("created_at BETWEEN ? AND ?", start_time, end_time).select( :consumer_id))