WhereNotIn子查询
问题描述:
我想要实现的是以下几点:WhereNotIn子查询
我想检查是否存在具有相同client_code
但具有较低的/不同campaign id
的记录。现在,我使用一个子查询和我试图做一个连接,以及,但我无法得到的逻辑工作
这是我现在得到:
$oDB = DB::table('campaigns AS c')
->select(
'c.id AS campaign_id',
'cc.id AS campaign_customer_id'
)
->join('campaign_customers AS cc', 'cc.campaign_id', '=', 'c.id')
->where('c.status', '=', ModelCampaign::STATUS_PLANNED)
->where('c.scheduled', '=', 1)
->whereRaw('c.scheduled_at <= NOW()')
->where('cc.status', '=', ModelCampaignCustomer::STATUS_INVITE_EMAIL_SCHEDULED)
->whereNotIn('cc.client_code', '=', function ($query){
$query ->select(DB::raw(1))
->from('campaign_customers')
->whereRaw('campaign_id', '!=', 'c.id');
})
->where('cc.active', '=', 1)
;
任何提示在如何工作的逻辑将是伟大的
答
您可以使用->toSql();
方法来查看SQL,以便您可以重构您的查询。
答
的whereNotIn
可能不应该有一个=
它
->whereNotIn('cc.client_code', function ($query){
....
编辑
尝试:
->whereNotIn('cc.client_code', function ($query){
$query->select(DB::raw('client_code'))
->from('campaign_customers')
->whereRaw('campaign_id != c.id');
})
我觉得whereRaw
应该是一个单一的文本字符串或可能你可以在这里使用where
(参考https://laravel.com/docs/5.2/queries#advanced-where-clauses)。另外DB::raw(1)
将为每个子查询结果返回一个1
,但您需要whereNotIn
的ID。
+0
修正了这个问题,但没有成功。它似乎没有得到父'c.id'的价值。有任何想法吗? – Taacoo
这返回 ''0 =>数组:3 [ “查询”=>“SELECT COUNT(*)作为从'campaigns'骨料如'C'内部联接'campaign_customers'如''上立方厘米cc' '.'cpaign_id' ='c'.'id' where'c'.'status' =?and'c'.'scheduled' =?and c.scheduled_at 数组:4 [ 0 => 1 1 => 1 2 => 2 3 => 1 ] “时间”=> 0.51 ] ]'' – Taacoo
我认为每?是模型的糟糕回报? – Taacoo
不,“?”符号是可以从一个查询变为另一个查询的查询信息:传递给查询的变量。 –