如何在进行内连接之前合并两个表?

时间:2015-09-02 07:59:09

标签: mysql

TABLE user
    - id
    - username
    - email
    - passwd

TABLE user_external 
    - id
    - username
    - email
    - passwd

TABLE orders
    - id
    - user_id
    - product

我有两个包含用户信息的表,我想合并以获取订单上的用户名。 我的select只从user表中获取名称(并从外部空白中删除),但不是user_external。

是否可以使用UNION用户表,然后进行左连接?

select 
orders.product,
merged_user_table.name as name
FROM orders o
LEFT JOIN merged_user_table user_assigned_to ON o.user_id = merged_user_table.id
WHERE
orders.id = 1

2 个答案:

答案 0 :(得分:1)

以下内容应该有效:

SELECT
    orders.product
    ,merged_user_table.name as name
FROM orders o
LEFT JOIN (
    SELECT id,username,email,passwd
    FROM user
    UNION ALL
    SELECT id,username,email,passwd
    FROM user_external
) merged_user_table user_assigned_to
    ON o.user_id = merged_user_table.id
WHERE
    orders.id = 1

我假设useruser_external表'用户是截然不同的在没有UNION的情况下使用ALL将有效地在子查询中的两个选择之间执行SELECT DISTINCT,这样效率会降低。

答案 1 :(得分:0)

虽然您可以使用子查询获取一个联合表,然后将其连接到订单,这意味着主连接不会使用索引。

因此,我可能会使用2个单独的查询,一个与用户加入订单,另一个用user_external加入订单,并将结果合并在一起。

这应该有效(使用INNER JOIN而不是LEFT OUTER JOIN - 无法理解为什么使用LEFT OUTER JOIN但可能有原因)。您已指定返回名为name的列,但是两个用户表都没有这样的列,所以不确定是否要带回用户名或表名 - 所以下面的示例SQL将两者都带回来。

SELECT orders.product,
        user.username as name,
        'user' as table_name
FROM orders o
INNER JOIN user 
ON o.user_id = user.id
WHERE orders.id = 1
UNION ALL
SELECT orders.product,
        user_external.username as name,
        'user_external' as table_name
FROM orders o
INNER JOIN user_external  
ON o.user_id = user_external.id
WHERE orders.id = 1