2016-11-06 33 views
2

私は2つのテーブル:ordersoldordersを持っています。どちらも同じように構成されています。私はこれらの2つのテーブルを結合し、別のテーブルに結合したい:users。以前は私はordersusersしか持っていませんでしたが、私は現在のコードにoldordersをひねりそうとしています。テーブルを2つのテーブルの結合に結合しますか?

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にある必要があります。 2つのテーブルの間に交差がないと仮定することができます。

答えて

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>をしたいなら、あなたは下のケースがちょうど括弧の後に、私のために違いを作るように見えた「O」ということLEFT JOIN

+0

の順序を変更する必要があります、私はそれについてのドキュメントを見つけることができませんが。 – kiwicomb123

関連する問題