尝试使用条件连接加入MYSQL表

时间:2017-09-21 14:40:29

标签: mysql database join

我正在尝试在MYSQL中加入一个表,但是基于一个条件。

我有一张支票表,每张支票都可以分配给一个用户,一个部门/位置组合,因此可以是一个位置,也可以是一个位置和一个部门。

检查表:

+----------+---------------+------------+------------+--------+----------+
| check_id | check_type_id |    due     | created_by | status | sign_off |
+----------+---------------+------------+------------+--------+----------+
|    19335 |            43 | 18/09/2017 |          3 |      1 |        1 |
|    19336 |             4 | 19/09/2017 |          3 |      1 |        1 |
|    19357 |            62 | 21/09/2017 |      47336 |      1 |        1 |
+----------+---------------+------------+------------+--------+----------+

用户分配存储在check_assigned_users表中,因此我可以加入此罚款。

但部门和地点存储在同一个表check_assigned_areas中。

检查指定的区域表:

+------------------------+---------------+----------+
| check_assigned_area_id | check_area_id | check_id |
+------------------------+---------------+----------+
|                  18801 |             9 |    19335 |
|                  18802 |           816 |    19336 |
|                  18803 |           816 |    19336 |
|                  18804 |          8086 |    19336 |
|                  18835 |          8091 |    19357 |
+------------------------+---------------+----------+

所以我需要一些基于area_level(3 = location和4 = department)加入区域表的方法来获取位置或部门名称。

区域表:

+---------+------------+--------------+------------+--------+
| area_id | area_title |  area_name   | area_level | active |
+---------+------------+--------------+------------+--------+
|    8091 | Location   | Luton Office |          3 |      1 |
|    8092 | Department | Development  |          4 |      1 |
+---------+------------+--------------+------------+--------+

所以我的思考过程将是:

1)通过check_id

加入check_assigned_areas表进行检查

2)为地点加入一次区域,再为基于area_level的部门加入。

像这样:

LEFT JOIN `areas` `l` ON `l`.`area_id` = `a`.`check_area_id` AND `l`.`area_level` = '3'
LEFT JOIN `areas` `d` ON `d`.`area_id` = `a`.`check_area_id` AND `l`.`area_level` = '4'

但它似乎没有产生任何结果

我一直在尝试以下查询的许多变体,但我要么根本没有返回数据,要么重复:

SELECT `c`.*, `t`.`check_name`,`a`.`check_area_id`,`l`.`area_name` AS 'location_name', `d`.`area_name` AS 'dept_name'
FROM `checks` `c`
LEFT JOIN `check_assigned_areas` `a` ON `a`.`check_id` = `c`.`check_id`
LEFT JOIN `areas` `l` ON `l`.`area_id` = `a`.`check_area_id` AND `l`.`area_level` = '3'
LEFT JOIN `areas` `d` ON `d`.`area_id` = `a`.`check_area_id` AND `l`.`area_level` = '4'
LEFT JOIN `check_types` `t` ON `t`.`check_type_id` = `c`.`check_type_id`
WHERE `c`.`org_id` = '297'
AND `c`.`status` != '0'
AND `c`.`due` <= '2017-09-21'

我一直在阅读很多关于条件连接的内容,而且我得到的感觉通常是它不是正确的做事方式。

所以我的问题是,我可以让这个查询做我想要的或做我需要重构我的数据库以获得check_assigned_departments和check_assigned_locations表,这似乎有点过分,我认为因为它们都存储在区域表中,所以我认为必须有一种方法可以正确地加入这个,但经过3天的尝试,我不知所措?

架构的SQL小提琴:http://sqlfiddle.com/#!9/a3c41/1

正如你在小提琴中看到的那样,check_id 19358在check_assigned_areas表中有2个赋值(area_id's),8091和8093.8091是一个位置(area_level = 3),8093是一个部门(area_level = 4),所以我希望结果在同一列中,其中area_name填充在location_name和department_name

这是我期待的结果:

array(13) {
  ["location_name"]=>
  string(9) "Mk Office"
  ["dept_name"]=>
  string(0) ""
  ["check_icon"]=>
  string(9) "fa-bell-o"
  ["check_desc"]=>
  string(0) ""
  ["check_status"]=>
  string(1) "1"
  ["check_type"]=>
  string(11) "Break Glass"
  ["check_area_id"]=>
  string(4) "8090"
  ["check_user_id"]=>
  string(5) "47336"
  ["due"]=>
  string(10) "2017-09-21"
  ["check_id"]=>
  string(5) "19360"
  ["user_name"]=>
  string(13) "Company Admin"
  ["sort_order"]=>
  string(1) "2"
  ["linked_documents"]=>
  bool(false)
}

编辑:将sqlfiddle和结果集添加到问题

0 个答案:

没有答案