【发布时间】:2018-10-18 01:27:45
【问题描述】:
我有一个具有以下关系的数据库:
有projects - 人们可以购买的东西,也有user_id,
有backers - 购买的人,
有orders - 每个订单是Backer 购买的Project(Backer 只能购买每个Project 一次)。这是一个金额 - 显示Backer 购买Project 所支付的费用
我需要编写以下查询 - 给定 $user_id、$count 和 $sum 找到所有至少投资于 $count 项目数量的支持者 user_id 等于 $user_id并且他们为这些项目购买的总和高于$sum。
Backer::whereHas('projects', function ($q) use ($sum, $userId){
$q->where('user_id', $userId);
}, '>=', $leastProjectCount)->get();
但它不限制购买的$sum
更新: 所以我想出了这个查询:
select * from `backers` \r\n
WHERE id > 0 \r\n
AND (select count(*)\r\n
FROM `projects` \r\n
inner join `orders` on `projects`.`id` = `orders`.`project_id` \r\n
where `backers`.`id` = `orders`.`backer_id` \r\n
and `user_id` = 6 \r\n
and exists (\r\n
select * \r\n
from `tags` \r\n
inner join `project_tag` on `tags`.`id` = `project_tag`.`tag_id` \r\n
where `projects`.`id` = `project_tag`.`project_id` \r\n
and `id` in (27)\r\n
) \r\n
) >= 1 \r\n
AND (select sum(orders.amount)\r\n
FROM `projects` \r\n
inner join `orders` on `projects`.`id` = `orders`.`project_id` \r\n
where `backers`.`id` = `orders`.`backer_id` \r\n
and `user_id` = 6 \r\n
and exists (\r\n
select * \r\n
from `tags` \r\n
inner join `project_tag` on `tags`.`id` = `project_tag`.`tag_id` \r\n
where `projects`.`id` = `project_tag`.`project_id` \r\n
and `id` in (27)\r\n
) \r\n
) >= 12
请注意,子查询几乎相同,只是第一个使用COunt(*),第二个使用sum(orders.amount)。另请注意,如果设置了所有参数,则会运行此查询,但如果未设置某些参数,则它可能会更短。我遇到的问题是我没有对这样的查询进行分页。
【问题讨论】:
-
我们可以暂时忘记所有 laravel/eloquent 的东西,只关注原始 sql 吗?