2016-11-06 27 views
2

我有兩個表格: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); 

輸出的是這樣的:

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 | 
+----------+-----+ 

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

創建oldorders表後

Jus不知道在哪裏或如何將工會拖入那裏。它不需要在orders上運行查詢,它需要在orders union oldorders上。可以認爲兩個表格之間沒有相交。

回答

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; 

首先使用與表之間UNIONordersoldorders獲得合併訂單。

其餘的工作和你所做的完全一樣。


SEE DEMO


注:

Left join不會在這種情況下才有意義。用戶不存在的訂單,那麼您將獲得NULL 0作爲輸出。這不具有任何價值。

如果你想<user,total orders>爲所有用戶,包括用戶誰可能沒有下令還那麼你需要改變的LEFT JOIN

+0

的順序小寫字母「O」只是在括號後,似乎讓我的區別,儘管我找不到任何文檔。 – kiwicomb123