[英]get table join with column value
如何使用列值连接表?
我有三个表,如下所示:
messages_table
----------------------------------------------------------------------------- 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_table
-------------------------— admin_id | admin_name -------------------------— 001 | Super Admin
manager_table
--------------------------- manager_id | manager_name --------------------------- 88 | Mandela 94 | Kristen
如何使用SQL查询获得如下所示的所需输出。 即,满足以下条件时,将关于列值的表连接:
如果user_type = admin
那么它应该与admin_table
加入。
如果user_type = manager
那么它应该与manager_table
加入。
期望的输出:
-----------------------------------------------------
msg_id | msg_sub | msg_to_name | msg_from_name
-----------------------------------------------------
001 | test | Mandela | Super Admin
002 | test2 | Mandela | Kristen
即根据列值获取join sql查询。
编辑:
我想从sql查询中获取数据而不是从服务器端编码。
我从这里尝试了这个查询,即Winfred的想法(已回答)
但是,我无法理解。
msg_by_usertype
是基于列的,值manager
然后应该选择manager_table
,如果是admin,则选择admin_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
这是一个SQL小提琴 ,看看它是如何工作的。 (它只有在你不能拥有像经理一样具有相同身份的管理员时才有效。在两个表中,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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.