加入查询..如果控制:是否可能?

时间:2011-08-03 09:25:23

标签: sql

我有这个数据库结构:

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

感谢您的帮助!

5 个答案:

答案 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表。

它还指导您选择创建真实视图以统一两个表格。