2017-05-28 99 views
1

无法找出情况下的查询,我只想显示未经验证订单的客户,但不包括已经拥有至少一个已验证订单的客户。一个客户可以在数据库中拥有更多记录,因为每个订单也创建了客户表中的新记录,因此如何跟踪特定用户的唯一方法是通过customer_number。连接和关联的子查询

我的数据库结构(简体):

customers: 
id | customer_number 

orders: 
id | customer_id | isVerified 

,我可能会需要结合加入和相关查询(搜索在客户表中的记录,每CUSTOMER_NUMBER和检查假isVerified列),它到底能特别是对于成千上万条记录来说,真的很慢

我使用Laravel所以雄辩的ORM是可用的,如果这可以让事情更容易。

(退一步讲:或者,也许这将是更快,更有效地重写的部分来建立针对特定用户的订单只有一个用户记录。)

任何想法?谢谢

回答

1

可能有几个方法可以做到这一点,但你可以实现这个结果与加盟,聚集和条件的总和:

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 > 0 

SQLfiddle here

+1

我得到这个工作适合我的需要只是: 上a.id = b.customer_id和 通过a.customer_number改变组...谢谢 – Johncze

0

这件怎么样?

$customer_list = customers::where('customer_number',$customer_number)->with('orders',function($query){ 
$query->where('isVerified',0); 
})->get(); 
1

可以实现这样的:

$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'); 
+0

看起来不错,将尝试,+1使用口若悬河,谢谢 – Johncze

+0

它解决你的问题吗? –

+0

还不知道,当我回到它时会让你知道 – Johncze

0

一种方法是聚合查询:

select c.customer_number 
from customers c join 
    orders o 
    on c.customer_id = o.customer_id 
group by c.customer_number 
having sum(isVerified = 1) = 0 and 
     sum(isVerified = 0) > 0; 

这种结构假定isVerified是一个数字,呈现0值假1为真。