我正在尝试在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和结果集添加到问题