我如何使用 JOIN 来根据不同表中的 WHERE 语句检索行?
How can I use JOIN in order to retrieve rows according to WHERE statements in distinct tables?
我弄了一个数据库,控制了一些orders
,每个订单有很多items
,自然是一个部门的用户提交的订单。
每个用户都属于特定角色,因此订单由具有不同更高角色的不同 users
连续审核。我用 delegate
字段控制下一个应该对订单做某事的用户。
我将描述我的一些 tables 及其相关领域:
Department:
- id
- name
User:
- id
- name
- department_id
- role
Order:
- id
- user_id
- delegate // Here I got an enum for the multiple roles a user can get
Revision:
- id
- order_id
- user_id
- operation
查询
所以我需要的是一个查询,用于检索其用户属于给定 department_id
且 delegate
字段等于一个提供的参数的所有订单,或者其中有记录revisions
table 其中 user_id
等于另一个提供的参数
我得到了什么...
在 Eloquent ORM 的帮助下,我得到了我需要的结果的第一部分的这种查询方式:
select `orders`.*, `users`.`department_id` from `orders` inner join `users` on `users`.`id` = `orders`.`user_id` where `users`.`department_id` = '1' and `delegate` = 'GERENTE DE DEPARTAMENTO' limit 2 offset 0
为了包含 OR,其中 revisions
table 处的记录 user_id
等于另一个提供的参数 部分我试图附加到查询的查询:
JOIN orders on revisions WHERE user_id = 5
但是没用...
我尝试的整个查询是:
select `orders`.*, `users`.`department_id` from `orders` inner join `users` on `users`.`id` = `orders`.`user_id` where `users`.`department_id` = '1' and `delegate` = 'GERENTE DE DEPARTAMENTO' JOIN orders on revisions WHERE user_id = 5
例子
我在我的查询示例中使用硬编码参数,因为它们来自真实示例...在这种情况下,我只需要获取用户属于 deparment_id
1,[=18 的所有订单=] 是 'GERENTE DE DEPARTAMENTO'
或者如果 revisions
table 处有行将 user_id
设置为 5
Orders:
+----+---------+-------------------------+
| id | user_id | delegate |
+----+---------+-------------------------+
| 1 | 4 | GERENTE DE DEPARTAMENTO |
| 2 | 2 | SUPERVISOR DE COMPRAS |
+----+---------+-------------------------+
Revisions:
+----+---------+----------+
| id | user_id | order_id |
+----+---------+----------+
| 1 | 5 | 2 |
| 2 | 5 | 2 |
+----+---------+----------+
有效查询应该只接受订单 1 和订单 2。 我该如何完成? 我对所需的 MySQL 很感兴趣,如果它是基于 Eloquent 的查询,我会加分。
您可以使用左联接。
您的查询可能如下所示:
select distinct `orders`.*, `users`.`department_id` from `orders`
left join `users` on `order`.`user_id`=`users`.`id`
left join `revisions` on `order`.`id`=`revisions`.`order_id`
and `revisions`.`user_id`=?
where `users`.`department_id`=?
and (`order`.`delegate`=? or `revisions`.`id` is not null)
如果我没猜错的话,即。你需要:
orders that delegate= $delegate AND have user_id= x if that user got as department_id= $department_id at users, OR revisions by user with id = $userId
那么这是Eloquent方式:
Order::where('delegate', $delegate)
->whereHas('user', function ($q) use ($depId) {
$q->where('department_id', $depId);
})->orWhereHas('revisions', function ($q) use ($userId) {
$q->where('user_id', $userId);
})
->get();
我弄了一个数据库,控制了一些orders
,每个订单有很多items
,自然是一个部门的用户提交的订单。
每个用户都属于特定角色,因此订单由具有不同更高角色的不同 users
连续审核。我用 delegate
字段控制下一个应该对订单做某事的用户。
我将描述我的一些 tables 及其相关领域:
Department:
- id
- name
User:
- id
- name
- department_id
- role
Order:
- id
- user_id
- delegate // Here I got an enum for the multiple roles a user can get
Revision:
- id
- order_id
- user_id
- operation
查询
所以我需要的是一个查询,用于检索其用户属于给定 department_id
且 delegate
字段等于一个提供的参数的所有订单,或者其中有记录revisions
table 其中 user_id
等于另一个提供的参数
我得到了什么...
在 Eloquent ORM 的帮助下,我得到了我需要的结果的第一部分的这种查询方式:
select `orders`.*, `users`.`department_id` from `orders` inner join `users` on `users`.`id` = `orders`.`user_id` where `users`.`department_id` = '1' and `delegate` = 'GERENTE DE DEPARTAMENTO' limit 2 offset 0
为了包含 OR,其中 revisions
table 处的记录 user_id
等于另一个提供的参数 部分我试图附加到查询的查询:
JOIN orders on revisions WHERE user_id = 5
但是没用...
我尝试的整个查询是:
select `orders`.*, `users`.`department_id` from `orders` inner join `users` on `users`.`id` = `orders`.`user_id` where `users`.`department_id` = '1' and `delegate` = 'GERENTE DE DEPARTAMENTO' JOIN orders on revisions WHERE user_id = 5
例子
我在我的查询示例中使用硬编码参数,因为它们来自真实示例...在这种情况下,我只需要获取用户属于 deparment_id
1,[=18 的所有订单=] 是 'GERENTE DE DEPARTAMENTO'
或者如果 revisions
table 处有行将 user_id
设置为 5
Orders:
+----+---------+-------------------------+
| id | user_id | delegate |
+----+---------+-------------------------+
| 1 | 4 | GERENTE DE DEPARTAMENTO |
| 2 | 2 | SUPERVISOR DE COMPRAS |
+----+---------+-------------------------+
Revisions:
+----+---------+----------+
| id | user_id | order_id |
+----+---------+----------+
| 1 | 5 | 2 |
| 2 | 5 | 2 |
+----+---------+----------+
有效查询应该只接受订单 1 和订单 2。 我该如何完成? 我对所需的 MySQL 很感兴趣,如果它是基于 Eloquent 的查询,我会加分。
您可以使用左联接。
您的查询可能如下所示:
select distinct `orders`.*, `users`.`department_id` from `orders`
left join `users` on `order`.`user_id`=`users`.`id`
left join `revisions` on `order`.`id`=`revisions`.`order_id`
and `revisions`.`user_id`=?
where `users`.`department_id`=?
and (`order`.`delegate`=? or `revisions`.`id` is not null)
如果我没猜错的话,即。你需要:
orders that delegate= $delegate AND have user_id= x if that user got as department_id= $department_id at users, OR revisions by user with id = $userId
那么这是Eloquent方式:
Order::where('delegate', $delegate)
->whereHas('user', function ($q) use ($depId) {
$q->where('department_id', $depId);
})->orWhereHas('revisions', function ($q) use ($userId) {
$q->where('user_id', $userId);
})
->get();