繁体   English   中英

连接表到两个表的联合?

[英]Joining table to union of two tables?

我有两个表: 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 orders oldorders 我该怎么做?

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 oldordersorders union oldorders orders运行查询。 可以假定两个表之间没有相交。

您只需要以这种方式进行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;

首先在ordersoldorders orders表之间使用UNION获取合并的订单。

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


查看演示


注意:

在这种情况下, Left join没有意义。 用户不存在的订单,那么您将获得NULL 0作为输出。 这没有任何价值。

如果要为所有用户(包括可能尚未订购的用户) <user,total orders> order>,那么您需要更改LEFT JOIN的顺序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM