将表连接到两个表的并集?

时间:2016-11-06 04:25:14

标签: mysql

我有两个表:ordersoldorders。两者的结构都是一样的。我想将这两个表联合起来,然后将它们连接到另一个表:users。以前我只有ordersusers,我正试图将oldorders塞进我当前的代码中。

SELECT u.username, COUNT(user) AS cnt
    FROM orders o
        LEFT JOIN users u 
        ON u.userident = o.user
    WHERE shipped = 1
    AND total != 0
    GROUP BY user

这会查找所有用户在表orders中所做的非零总订单数,但我想在ordersoldorders的联合中进行此操作。我怎么能做到这一点?

create table orders (
    user int,
    shipped int,
    total decimal(4,2)
);
insert into orders values
    (5, 1, 28.21),
    (5, 1, 24.12),
    (5, 1, 19.99),
    (5, 1, 59.22);
create table users (
    username varchar(100),
    userident int
);
insert into users values
    ("Bob", 5);

输出为:

+----------+-----+
| username | cnt |
+----------+-----+
|   Bob    |  4  |
+----------+-----+

创建oldorders表后:

create table oldorders (
    user int,
    shipped int,
    total decimal(4,2)
);
insert into oldorders values
    (5, 1, 62.94),
    (5, 1, 53.21);

在两个表的并集上运行时的预期输出是:

+----------+-----+
| username | cnt |
+----------+-----+
|   Bob    |  6  |
+----------+-----+

不知道在哪里或如何将一个联盟装进那里。它不是在orders上运行查询,而是需要在orders union oldorders上。可以假设两个表之间没有相交。

1 个答案:

答案 0 :(得分:4)

您只需union这样:

SELECT u.username, COUNT(user) AS cnt
FROM 
(
    SELECT * FROM orders 
    UNION
    SELECT * FROM oldorders
) o
LEFT JOIN users u ON u.userident = o.user
WHERE shipped = 1
AND total != 0
GROUP BY user;

首先在UNIONorders表之间使用oldorders获取合并订单。

其余的工作与你所做的完全相同。

SEE DEMO

注意:

在这种情况下,

Left join没有意义。用户不存在的订单然后您将获得NULL 0作为输出。这并没有任何价值。

如果您希望所有用户(包括可能尚未订购的用户)<user,total orders>,则需要更改LEFT JOIN的订单