Mysql 如何在进行内部联接之前合并两个表?

Mysql 如何在进行内部联接之前合并两个表?,mysql,Mysql,我有两个表,其中包含要合并的userinformation,以便在订单上获得usersname。 my select只从用户表中获取名称(并将外部表中的名称保留为空),而不从用户表外部获取名称 有没有办法联合用户表,然后进行左连接 TABLE user - id - username - email - passwd TABLE user_external - id - username - email - passwd TA

我有两个表,其中包含要合并的userinformation,以便在订单上获得usersname。 my select只从用户表中获取名称(并将外部表中的名称保留为空),而不从用户表外部获取名称

有没有办法联合用户表,然后进行左连接

TABLE user
    - id
    - username
    - email
    - passwd

TABLE user_external 
    - id
    - username
    - email
    - passwd

TABLE orders
    - id
    - user_id
    - product

以下方面应起作用:

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

我假设
user
user\u external
表的用户是不同的。使用
UNION
而不使用
ALL
将有效地在子查询中的两个选择之间执行
SELECT DISTINCT
,这将降低效率。

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

因此,我可能会使用两个单独的查询,一个将订单与用户关联,另一个将订单与用户_外部关联,并将结果合并在一起

这应该是可行的(使用内部联接而不是左外部联接-看不出为什么要使用左外部联接,但可能有原因)。您已经指定返回一个名为name的列,但两个用户表都没有这样的列,因此不确定您是要返回用户名还是表名,因此下面的示例SQL同时返回这两个列

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

是的,您可以使用
union
,然后进行连接,最后可能是order by子句。我们将介绍这方面的示例。
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