关于如何检查子表是不是具有某些多个值的雄辩或 SQL 方式
Posted
技术标签:
【中文标题】关于如何检查子表是不是具有某些多个值的雄辩或 SQL 方式【英文标题】:Eloquent or SQL way on how to check if child table has certain multiple values关于如何检查子表是否具有某些多个值的雄辩或 SQL 方式 【发布时间】:2019-06-15 14:37:01 【问题描述】:根据给定的 ID 检查表是否具有值的 Eloquent 或 SQL 方法是什么?
客户表示例:
id name created_at
1 test_1 01/01/2019
2 test_2 01/24/2019
3 test_3 01/25/2019
样品采购表:
id customer_id status created_at
1 2 paid 02/01/2019
2 2 paid 02/02/2019
3 2 unpaid 02/03/2019
4 2 cancelled 02/03/2019
5 3 paid 02/03/2019
6 1 paid 02/03/2019
我想要实现的是检查是否有未付款和取消状态的客户
目前我的代码是这样的:
Customers::with('purchases')->get();
但我希望它只从购买表中获取未付款和取消状态的客户
【问题讨论】:
请说明您是否需要最后状态或其他内容。 【参考方案1】:使用 SQL,您需要 group by customer_id
并且 having
子句中的条件 count(distinct status) = 2
将为您提供您想要的客户:
select customer_id
from purchases
where status in ('unpaid', 'cancelled')
group by customer_id
having count(distinct status) = 2
如果您希望客户只有“未付款”和“已取消”状态而没有其他状态:
select customer_id
from purchases
group by customer_id
having
count(distinct status) = 2
and
sum(case when status not in ('unpaid', 'cancelled') then 1 else 0 end) = 0
【讨论】:
使用“count(distinct...)”进行智能移动【参考方案2】:解决了
doesntHave()
Laravel 雄辩的。
在客户的模型中,我放了:
public function unpaid_and_cancelled_purchases()
return $this->hasMany('App\Purchase', 'customer_id', 'id')
->whereIn('status', ['unpaid', 'cancelled']);
在我的控制器中,我是这样写的:
$customers = Customers::doesntHave('unpaid_and_cancelled_purchases')->get();
【讨论】:
【参考方案3】:select name
from customers c
inner join purchases p on c.id = p.id
where c.id = CustomerId
and status in (cancelled, unpaid)
group by customer.id
【讨论】:
以上是关于关于如何检查子表是不是具有某些多个值的雄辩或 SQL 方式的主要内容,如果未能解决你的问题,请参考以下文章
如果字符串中的值具有多个点值,如何检查双精度值是不是具有小数部分