2010-12-11 88 views
0

我有一个表包含来自用户和组织的消息。该表包含称为usertype的字段,该字段指示消息是由用户还是组织发送的。Mysql加入与两个其他表基于标志列

我必须加入这个表格,其中包含两个分别包含用户详细信息和组织详细信息的表格。

我该如何写2个表的连接查询?

我想我可以通过一个联合来实现这一点,但是可以只使用联接来完成吗?

表 - 用户获取:用户名
表 - 组织获取:组织名称
表信息 - 条目的用户ID,用户类型。 必须通过检查数据类型获取用户名

+0

你不应该在一个表中有不相关的实体。用户表中的用户,组织表中的组织。如果你真的需要编写这个奇怪的查询,UNION将工作。 – 2010-12-11 09:53:34

回答

1

工会和JOIN的做完全不同的事情。 UNIONs将记录追加到查询的末尾,JOINs将字段添加到记录的末尾。

如果您的UNION查询有效,那么我建议您坚持使用它。如果你真的想用JOIN做到这一点,那么你可以做以下事情并相应地改变你的工作流程。

SELECT message_id, message_title, user.name, corp.name 
FROM group_messages 
LEFT JOIN users ON 
    users.user_id = group_messages.user_id 
    AND group_messages.usertype = "1" 
LEFT JOIN corp ON 
    corp.user_id = group_messages.user_id 
    AND group_messages.usertype = "0" 
; 

这将做的是返回包含字段为用户和字段为公司的记录。当usertype为1时,用户字段将被填充,并且corp字段将为空。当usertype为0时,corp字段将被填充,并且用户字段将为空。您需要编写应用程序逻辑来读取返回的usertype并确定要读取的字段集合。老实说,如果你做了这样的事情,你只需要做两个单独的查询就好了很多。

如果您不希望每个类型的数据位于不同的字段中,则不应使用JOIN。如果您希望每个类型的数据在同一个字段中返回,您需要一个已拥有的UNION。

+0

thnkz为您的建议我会更好地坚持我的联合查询 – Harish 2010-12-11 10:44:06

0

我的使用联盟的查询可以使用联接来实现吗?

SELECT message_id,CONCAT_WS(””,赋。user_first_name,福。user_last_name) UNAME,user_typemessage_titlemessage_contentposted_on FROM group_messages FGM JOIN users福 ON FGM。 user_type ='1'AND fu。 user_id = fgm。 user_id WHERE group_id = '1' UNION
SELECT message_idcorporate_name UNAME, user_typemessage_titlemessage_contentposted_on FROM group_messages FGM JOIN corporate FC的FGM。 user_type ='0'AND fc。 corporate_id = fgm。 user_id WHERE group_id = '1'