我有两个表:orders
和oldorders
。两者的结构都是一样的。我想将这两个表联合起来,然后将它们连接到另一个表:users
。以前我只有orders
和users
,我正试图将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
中所做的非零总订单数,但我想在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 oldorders
上。可以假设两个表之间没有相交。
答案 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;
首先在UNION
和orders
表之间使用oldorders
获取合并订单。
其余的工作与你所做的完全相同。
注意:强>
在这种情况下, Left join
没有意义。用户不存在的订单然后您将获得NULL 0
作为输出。这并没有任何价值。
如果您希望所有用户(包括可能尚未订购的用户)<user,total orders>
,则需要更改LEFT JOIN
的订单