php - MySQL : Get user details using nested relational table

标签 php mysql sql relational-database

在下面显示表格 usersstu_masterstu_infoemp_masteremp_info .

用户

enter image description here

stu_master

stu_master_user_id = users.user_id

enter image description here

stu_info

stu_info_id = stu_master.stu_master_stu_info_id

![enter image description here

emp_master

em_user_id = users.user_id

enter image description here

员工信息

emp_info_id = emp_master.em_emp_info_id

![enter image description here

我使用以上 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 studentall employee。 显示下面的输出

![enter image description here

我使用任何单个查询仅在给定 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/

相关文章:

php - 在 MySQL 中使用子查询进行选择

mysql复制与ansible

javascript - 在 NodeJS 中使用 MySQL 的 Passportjs

java - 计算 H2 数据库引擎中表中的条目数

c++ - qt bindvalue() 无法动态绑定(bind)值

php - Jquery更新mysql表数据时立即显示最新数据

PHP/Wordpress - 向父菜单添加箭头

php - 标准化图像的正确方法

MySQL & 嵌套集 : slow JOIN (not using index)

php - 使用 php/mysql 的简单 URL 旋转器