在下面显示表格 users
、stu_master
、stu_info
、emp_master
和 emp_info
.
用户
stu_master
stu_master_user_id
= users.user_id
stu_info
stu_info_id
= stu_master.stu_master_stu_info_id
emp_master
em_user_id
= users.user_id
员工信息
emp_info_id
= emp_master.em_emp_info_id
我使用以上 5 个表通过单个查询获取用户的名字或姓氏;
我主要有两种类型的用户,一种是Student
,另一种是Employee
,它的登录详细信息存储在单个表中,它的名字是Users
。但是,我根据用户类型将名字/姓氏相关的详细信息存储在两个不同的表中。如果用户类型是 S。我将使用 stu_master
表在 stu_info
中获取名字/姓氏,因为 user_id
关系在 stu_master 表中可用,其他明智的用户类型是 E
,使用 emp_master
表获取 emp_info
中的名字/姓氏,因为 emp_master 表中的 user_id
关系。
我的表关系:
- 对于 Student = Users->stu_master->stu_info,
- 对于 Employee = Users->emp_master->emp_info,
我尝试了以下查询,但没有得到预期的结果。
SELECT user_id as UserId, stu_first_name as FirstName, stu_last_name as LastName, user_type as UserType FROM `users`
LEFT JOIN stu_master tsm ON (stu_master_user_id = user_id AND `user_type` = 'S')
LEFT JOIN stu_info tsi ON (tsm.stu_master_stu_info_id = tsi.stu_info_id)
UNION ALL
SELECT user_id as UserId, emp_first_name as FirstName, emp_last_name as LastName, user_type as UserType FROM `users`
LEFT JOIN emp_master tem ON (em_user_id = user_id AND `user_type` = 'E')
LEFT JOIN emp_info tei ON (tem.em_id = tei.emp_info_id)
WHERE `user_id` IN (1, 2, 3, 4, 5, 6);
以上查询返回all student
和all employee
。
显示下面的输出
我使用任何单个查询仅在给定 id (1, 2, 3, 4, 5, 6) 时获取名字/姓氏。
请给我任何类型的单一查询来实现我的要求或修改我的上述查询。
最佳答案
你真的很亲密,你甚至不需要工会。
这里有三种方法,一种使用 case 语句,一种使用 NVL(),一种使用内联 View (如果您不能更改表结构,我会使用内联 View ,它“应该”表现最好。但是,如果您要抓取的用户列表足够大,您可能需要额外添加 where 子句的副本,以便在内联 View 的每个 select 语句中)。
SELECT `user_id` as UserId
, (CASE WHEN `user_type` = 'S' THEN `stu_first_name`
WHEN `user_type` = 'E' THEN `emp_first_name`
END) as FirstName
, (CASE WHEN `user_type` = 'S' THEN `stu_last_name`
WHEN `user_type` = 'E' THEN `emp_last_name`
END) as LastName
, user_type as UserType
FROM `users`
LEFT JOIN stu_master tsm ON (stu_master_user_id = user_id AND `user_type` = 'S')
LEFT JOIN stu_info tsi ON (tsm.stu_master_stu_info_id = tsi.stu_info_id)
LEFT JOIN emp_master tem ON (em_user_id = user_id AND `user_type` = 'E')
LEFT JOIN emp_info tei ON (tem.em_id = tei.emp_info_id)
WHERE `user_id` IN (1, 2, 3, 4, 5, 6);
SELECT `user_id` as UserId
, NVL(`stu_first_name`,`emp_first_name`) as FirstName
, NVL(`stu_last_name`,`emp_last_name`) as LastName
, user_type as UserType
FROM `users`
LEFT JOIN stu_master tsm ON (stu_master_user_id = user_id AND `user_type` = 'S')
LEFT JOIN stu_info tsi ON (tsm.stu_master_stu_info_id = tsi.stu_info_id)
LEFT JOIN emp_master tem ON (em_user_id = user_id AND `user_type` = 'E')
LEFT JOIN emp_info tei ON (tem.em_id = tei.emp_info_id)
WHERE `user_id` IN (1, 2, 3, 4, 5, 6);
SELECT `user_id` as UserId
, `FirstName` as FirstName
, `LastName` as LastName
, `user_type` as UserType
FROM `users`
LEFT JOIN
(
SELECT 'S' as user_type
, stu_master_user_id as user_id
, stu_first_name as FirstName
, stu_last_name as LastName
FROM stu_master tsm
INNER JOIN stu_info tsi ON (tsm.stu_master_stu_info_id = tsi.stu_info_id)
UNION ALL
SELECT 'E' as user_type
, em_user_id as user_id
, emp_first_name as FirstName
, emp_last_name as LastName
FROM emp_master tem
INNER JOIN emp_info tei ON (tem.em_id = tei.emp_info_id)
) `User_info` USING (user_id, user_type)
WHERE `user_id` IN (1, 2, 3, 4, 5, 6);
;
下面是我用来在 sqlfiddle.com 中创建虚拟表的代码
CREATE TABLE users
(`user_id` int, `user_type` varchar(1))
;
insert into users VALUES (1,'A');
insert into users VALUES (2,'E');
insert into users VALUES (3,'E');
insert into users VALUES (4,'S');
insert into users VALUES (5,'S');
insert into users VALUES (6,'S');
CREATE TABLE stu_master
(`stu_master_id` int,`stu_master_stu_info_id` int,`stu_master_user_id` int)
;
insert into stu_master VALUES (1,1,4);
insert into stu_master VALUES (2,2,5);
insert into stu_master VALUES (3,3,6);
insert into stu_master VALUES (4,4,7);
insert into stu_master VALUES (5,5,8);
CREATE TABLE stu_info
(`stu_info_id` int,`stu_first_name` varchar(10),`stu_last_name` varchar(10))
;
insert into stu_info VALUES (1,'Student','One');
insert into stu_info VALUES (2,'Student','Two');
insert into stu_info VALUES (3,'Student','Three');
insert into stu_info VALUES (4,'Student','Four');
insert into stu_info VALUES (5,'Student','Five');
CREATE TABLE emp_master
(`em_id` int,`em_emp_info_id` int,`em_user_id` int)
;
insert into emp_master VALUES (1,1,2);
insert into emp_master VALUES (2,2,3);
insert into emp_master VALUES (3,3,736);
insert into emp_master VALUES (4,4,737);
insert into emp_master VALUES (5,5,738);
CREATE TABLE emp_info
(`emp_info_id` int,`emp_first_name` varchar(10),`emp_last_name` varchar(10))
;
insert into emp_info VALUES (1,'Employee','One');
insert into emp_info VALUES (2,'Employee','Two');
insert into emp_info VALUES (3,'Employee','Three');
insert into emp_info VALUES (4,'Employee','Four');
insert into emp_info VALUES (5,'Employee','Five');
关于php - MySQL : Get user details using nested relational table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37499391/