新手问题 获取一段时间内没有下单的用户,应该怎么写查询语句..

Catherine · 2015年12月15日 · 最后由 top_weijie 回复于 2016年04月11日 · 2838 次阅读

一个 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)

#1 楼 @fate 在 rails 里怎么体现这个 not exists 呢?

#2 楼 @catherine 用所有用户的集合,减去下单用户的集合不就好了,不是非得要一次查询出来啊

#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) 这样应该可以的,你试试

#3 楼 @lionzixuanyuan 完成作业倒是可以,但项目里这么做不现实啊,每次查询都 User.all

User.includes(:orders).where().not(orders: {created_at: start_time..end_time})

这样么?

#6 楼 @stone 这个不对,但还是谢谢回复!

#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))

#8 楼 @yue 头像好美。。。。但这句有点问题,报错是 where 少个参数,0 for 1

10 楼 已删除

你竟然有个表名字叫 transaction ? 赶紧 rename 吧,后患无穷啊

在 ruby 应该怎么写?view、controllers 和 model 都应该怎么写

需要 登录 后方可回复, 如果你还没有账号请 注册新账号