Sql 获取具有列值的表联接
如何使用列值联接表 我有以下三个表格:Sql 获取具有列值的表联接,sql,join,Sql,Join,如何使用列值联接表 我有以下三个表格: 消息\u表 ----------------------------------------------------------------------------- msg_id | msg_sub | msg_to | to_user_type | msg_from | from_user_type --------------------------------------------------------------------
- 消息\u表
----------------------------------------------------------------------------- msg_id | msg_sub | msg_to | to_user_type | msg_from | from_user_type ----------------------------------------------------------------------------- 001 | test | 88 | manager | 42 | admin 002 | test2 | 88 | manager | 94 | manager
-------------------------— admin_id | admin_name -------------------------— 001 | Super Admin
--------------------------- manager_id | manager_name --------------------------- 88 | Mandela 94 | Kristen
- 管理表
----------------------------------------------------------------------------- msg_id | msg_sub | msg_to | to_user_type | msg_from | from_user_type ----------------------------------------------------------------------------- 001 | test | 88 | manager | 42 | admin 002 | test2 | 88 | manager | 94 | manager
-------------------------— admin_id | admin_name -------------------------— 001 | Super Admin
--------------------------- manager_id | manager_name --------------------------- 88 | Mandela 94 | Kristen
- manager\u表
----------------------------------------------------------------------------- msg_id | msg_sub | msg_to | to_user_type | msg_from | from_user_type ----------------------------------------------------------------------------- 001 | test | 88 | manager | 42 | admin 002 | test2 | 88 | manager | 94 | manager
-------------------------— admin_id | admin_name -------------------------— 001 | Super Admin
--------------------------- manager_id | manager_name --------------------------- 88 | Mandela 94 | Kristen
user\u type=admin
,那么它应该与admin\u表
连接user\u type=manager
,那么它应该与manager\u表
连接-----------------------------------------------------
msg_id | msg_sub | msg_to_name | msg_from_name
-----------------------------------------------------
001 | test | Mandela | Super Admin
002 | test2 | Mandela | Kristen
即根据列值获取联接sql查询
编辑:
-----------------------------------------------------
msg_id | msg_sub | msg_to_name | msg_from_name
-----------------------------------------------------
001 | test | Mandela | Super Admin
002 | test2 | Mandela | Kristen
我想从sql查询中获取数据,而不是从服务器端编码中获取数据
我试着从Winfred的想法(已回答)提出这个问题
然而,我无法理解
msg\u by\u usertype
是基于列的,其中值manager
则应选择manager\u table
,如果是admin toadmin\u table
,据我所知,您可以尝试以下方法:
SELECT msg_id,
msg_body,
usersBy.userName AS msg_by,
usersTo.userName AS msg_to,
msg_by_usertype
FROM messages
INNER JOIN
(SELECT admin_id As id, admin_name as userName
FROM admin_table
UNION
SELECT manager_id As id, manager_name as userName
FROM manager_table ) usersTo ON msg_to = usersTo.id
INNER JOIN
(SELECT admin_id As id, admin_name as userName
FROM admin_table
UNION
SELECT manager_id As id, manager_name as userName
FROM manager_table ) usersBy ON msg_by = usersBy.id
下面是一个例子,看看它是如何工作的。(只有当您的管理员不能像经理一样拥有相同的id时,它才起作用。id在两个表中都应该是唯一的。)请使用下面的SQL语句
SELECT msg_id,
msg_body,
usersBy.userName AS msg_by,
usersTo.userName AS msg_to,
msg_by_usertype
FROM messages
INNER JOIN
(SELECT admin_id As id, admin_name as userName,'admin' as usertype
FROM admin_table
UNION
SELECT manager_id As id, manager_name as userName,'manager' as usertype
FROM manager_table ) usersTo
ON msg_to = usersTo.id and msg_by_usertype = usersTo.usertype
如果我没弄错你的问题,你想要这样的结果吗
MSG_ID MSG_BODY MSG_TO BY MSG_BY_USERTYPE
---------- ---------- ---------- ----------- ---------------
001 test adm1 managone manager
002 sadff adm1 adm3? admin
如果是这样,你可以用这个
SELECT MSG_ID, MSG_BODY, MSG_TO,
CASE
WHEN MSG_BY_USERTYPE = 'admin' THEN COALESCE(
(SELECT ADMIN_NAME FROM ADMIN_TABLE
WHERE MSG_BY = ADMIN_ID), RTRIM(MSG_BY) CONCAT '?')
WHEN MSG_BY_USERTYPE = 'manager' THEN COALESCE(
(SELECT MANAGER_NAME FROM MANAGER_TABLE
WHERE MSG_BY = MANAGER_ID), RTRIM(MSG_BY) CONCAT '?')
ELSE ' '
END AS BY,
MSG_BY_USERTYPE
FROM MESSAGES
您要检索哪些列?此外,这些表之间的关系如何?示例消息表和管理表?他们的链接栏是什么?我编辑了这个问题,请看一看。