无法确定查询的情况,在这种情况下,我希望仅显示具有未验证订单的客户,但不包括已至少具有一个已验证订单的客户。一个客户可以在数据库中有更多的记录,因为对于每个订单,在customers表中也会有新的记录,所以跟踪特定用户的唯一方法是通过customer_number。
我的数据库结构(简化版):
customers:
id | customer_number
orders:
id | customer_id | isVerified我可能需要组合连接和相关查询(在customers表中搜索每个customer_number的记录,并检查isVerified列中的false),这最终可能会非常慢,特别是对于数以千计的记录。
我使用Laravel,所以如果这可以让事情变得更容易,那么可以使用雄辩的ORM。
(再想一想:或者重写该部分,以便只为特定用户的订单创建一条用户记录,可能会更快、更高效。)
有什么想法吗?谢谢你
发布于 2017-05-28 19:25:59
可能有几种方法可以做到这一点,但您可以通过连接、聚合和条件求和来实现此结果:
select a.customer_id,
sum( case when isVerified = 1 then 1 else 0 end ) as Num_Verified,
sum( case when isVerified = 0 then 1 else 0 end ) as Num_unVerified
from customers as a
left join
orders as b
on a.customer_id = b.customer_id
group by a.customer_id
having Num_Verified = 0
and Num_unVerified > 0SQLfiddle here
发布于 2017-05-28 19:29:00
你可以像这样实现:
$customer_id = Customer::join('orders','customers.id','orders.cutomer_id')
->where('isVerified',true)
->select('orders.*')
->groupBy('customer_id')
->pluck('customer_id');这将为客户提供至少一个经过验证的订单。
现在,通过以下方式获取具有未经验证订单的客户:
$customers = Customer::join('orders','customers.id','orders.customer_id')
->where('isVerified',false)
->whereNotIn('customer_id',$customer_id)
->select('customers.customer_number','orders.*')
->groupBy('customer_id')
->pluck('customer_id');发布于 2017-05-28 19:27:47
这个怎么样?
$customer_list = customers::where('customer_number',$customer_number)->with('orders',function($query){
$query->where('isVerified',0);
})->get();https://stackoverflow.com/questions/44226437
复制相似问题