我有这个数据库结构:
Message
msg_by usertype message
2 U how are you ?
1 A i'm fine
SimpleUser
id fullname
1 mike
2 john
AdminUser
id fullname
1 frank
2 lucas
好的,我知道将用户分成两个表是不对的,但我继承了这个项目。
我的问题是如何进行查询,使用SimpleUser和AdminUser加入Message ...结果为每个消息提供正确的名称,基于usertype:如果U消息来自SimpleUser表,如果A消息是来自AdminUser
感谢您的帮助!
答案 0 :(得分:4)
使用UNION
:
SELECT fullname, message FROM msg_by JOIN SimpleUser ON(msg_by = SimpleUser.id)
WHERE usertype = "U"
UNION ALL
SELECT fullname, message FROM msg_by JOIN AdminUser ON(msg_by = AdminUser.id)
WHERE usertype = "A"
答案 1 :(得分:4)
这是一个返回所需行的查询:
SELECT
msg_by, usertype, message, full_name
FROM
Message
INNER JOIN
SimpleUser
ON
SimpleUser.id = Message.msg_by
AND
Message.usertype = 'U'
UNION ALL
SELECT
msg_by, usertype, message, full_name
FROM
Message
INNER JOIN
AdminUser
ON
AdminUser.id = Message.msg_by
AND
Message.usertype = 'A'
答案 2 :(得分:2)
你不需要工会。您可以将usertype添加到连接:
select
m.*,
ifnull(a.full_name, s.full_name)
from
Message m
left join AdminUser a on a.id = m.msg_by and m.usertype = 'A'
left join SimpleUser s on s.id = m.msg_by and m.usertype = 'U'
答案 3 :(得分:1)
类似的东西:
SELECT m.message, COALESCE(s.fullname, a.fullname)
FROM Message m
LEFT OUTER JOIN SimpleUser s
ON m.usertype = 'U'
AND m.msg_by = s.id
LEFT OUTER JOIN AdminUser a
ON m.usertype = 'A'
AND m.msg_by = a.id
答案 4 :(得分:1)
就个人而言,我的自然倾向是使用LEFT JOIN方法。
然而,考虑到UNION方法可能是最好的 - 如果以内联视图的形式布局......
SELECT
Message.*,
User.*
FROM
Message
INNER JOIN
(
SELECT *, 'A' as UserType From AdminUsers
UNION ALL
SELECT *, 'U' AS UserType FROM SimpleUsers
)
AS User
ON User.UserType = Message.UserType
AND User.ID = Message.msg_by
使用此内联视图布局可能可以提高性能,因为只需要扫描一次Message表。
它还指导您选择创建真实视图以统一两个表格。