我如何使用 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_iddelegate 字段等于一个提供的参数的所有订单,或者其中有记录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();