我想显示2个或更多查询中的所有记录,这些记录也不在左查询中

时间:2017-03-24 09:16:21

标签: mysql sql join

我有这样的查询

SET @curr_date = '2017-03-23';

SELECT 
curr_week.mid AS MID, 
curr_week.EDC AS Merchant_Name ,
COALESCE(curr_week.amount,0) AS Total_Amount_Curr_Week, 
COALESCE(curr_week.total_trx,0) AS Total_Trx_Curr_Week, 
COALESCE(curr_week.total_user,0) AS Total_User_Curr_Week,

COALESCE(last_week.amount,0) AS Total_Amount_Last_Week,

COALESCE(last_week.total_trx,0) AS Total_Trx_Last_Week,

COALESCE(last_week.total_user,0) AS Total_User_Last_Week
FROM
(
    SELECT a.*, b.total_user
    FROM 
    (
        SELECT a1.owner_name AS MID, m.name AS EDC,SUM(t1.amount) AS amount, COUNT(t1.id) AS total_trx
        FROM members m
        JOIN accounts a1 ON a1.member_id = m.id
        JOIN transfers t1 ON a1.id = t1.to_account_id
        WHERE DATE(t1.DATE) = (@curr_date - INTERVAL 1 DAY)
        GROUP BY a1.owner_name
    ) AS a

    JOIN

    (-- get total user
        SELECT COUNT(r.ecash_no) AS total_user, r.mid, r.merchant_name
        FROM 
            (
                SELECT a.`owner_name` AS ecash_no,
                a1.owner_name AS MID, 
                m.name AS merchant_name 
                FROM accounts a1
                JOIN transfers t1 ON a1.id = t1.to_account_id
                JOIN members m ON a1.member_id = m.id
                JOIN accounts a ON a.id = t1.from_account_id
                WHERE DATE(t1.date) = (@curr_date - INTERVAL 1 DAY)
                GROUP BY a.owner_name,m.`name`
            ) AS r
        GROUP BY r.mid
    ) AS b ON a.mid = b.mid
) AS curr_week

JOIN

(
-- last week
    SELECT a.*, b.total_user
    FROM 
    (
        SELECT a1.owner_name AS MID, m.name AS EDC,SUM(t1.amount) AS amount, COUNT(t1.id) AS total_trx
        FROM members m
        JOIN accounts a1 ON a1.member_id = m.id
        JOIN transfers t1 ON a1.id = t1.to_account_id
        WHERE DATE(t1.DATE) = (@curr_date - INTERVAL 1 DAY) - INTERVAL 1 WEEK
        GROUP BY a1.owner_name
    ) AS a

    JOIN

    (-- get total user
        SELECT COUNT(r.ecash_no) AS total_user, r.mid, r.merchant_name
        FROM (
            SELECT a.`owner_name` AS ecash_no,
            a1.owner_name AS MID, 
            m.name AS merchant_name 
            FROM accounts a1
            JOIN transfers t1 ON a1.id = t1.to_account_id
            JOIN members m ON a1.member_id = m.id
            JOIN accounts a ON a.id = t1.from_account_id
            WHERE DATE(t1.date) = (@curr_date - INTERVAL 1 DAY) - INTERVAL 1 WEEK
            GROUP BY a.owner_name,m.`name`
        ) AS r
        GROUP BY r.mid
    ) AS b ON a.mid = b.mid
) AS last_week ON curr_week.mid = last_week.mid

如何从联合查询中检索所有EDC值。 因为如果我使用join,它只显示相同的值。 如果我使用左连接,它将遵循左查询中的值 有没有办法用连接显示所有内容?

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法模拟两个表的完整外连接:

SELECT COALESCE(a.ColA, b.ColA) AS ColA,
       COALESCE(a.ColB, b.ColB) AS ColB
FROM tableA a
LEFT JOIN tableB b ON a.ColA = b.ColA
UNION
SELECT COALESCE(a.ColA, b.ColA) AS ColA,
       COALESCE(a.ColB, b.ColB) AS ColB
FROM tableA a
RIGHT JOIN tableB b ON a.ColA = b.ColA;

注意:我假设只有ColA是连接列。您也可以将ColB添加为加入列,或仅使用ColB作为加入列。这实际上取决于你的桌子的设计,但我给出的一般方法仍然有用。

<强>输出:

enter image description here

在这里演示:

Rextester