mysql不支持full join的另一種解決辦法 和根據多個表中的相同分組來連接查詢


先看兩張表:

1. user表:

2. animal表:

現在我想要查詢各省市區對應的人名和動物名,即根據省市區來連接兩張表。

考慮到user表中有的省市區可能在animal表中沒有,animal表中有的省市區user表中可能沒有,所以兩張表需要全連接。

但是mysql本身不支持全連接,除了用union連接左連接查詢和右連接查詢外,現提供另外一種有效的解決方案。

1) 根據兩表的省市區建立視圖,視圖中省市區組合不重復:

create view v as
SELECT u.province_id,u.city_id,u.district_id from user u
union 
SELECT a.province_id,a.city_id,a.district_id from animal a

建好的視圖:

 

2)這樣視圖中就有了全部的不重復的省市區組合,然后user表和animal表和這個視圖根據省市區條件左連接即可:

SELECT
    v.province_id,
    v.city_id,
    v.district_id,
    u.`name`,
    u.money,
    a.`name`,
    a.amount
FROM
    v
LEFT JOIN USER u ON v.province_id = u.province_id
AND v.city_id = u.city_id
AND v.district_id = u.district_id
LEFT JOIN animal a ON v.province_id = a.province_id
AND v.city_id = a.city_id
AND v.district_id = a.district_id

查詢出來的結果:

到此 查詢各省市區對應的人名和動物名 完成。

 

現在我想查詢各省市區對應的錢數(money_sum)和動物數(amount_sum):

sql如下:

SELECT
    v.province_id,
    v.city_id,
    v.district_id,
    u.money_sum,
    a.amount_sum
FROM
    v
LEFT JOIN (
    SELECT
        u.province_id,
        u.city_id,
        u.district_id,
        sum(u.money) 'money_sum'  -- 分組統計值
    FROM
        USER u
    GROUP BY
        u.province_id,
        u.city_id,
        u.district_id
) u ON v.province_id = u.province_id
AND v.city_id = u.city_id
AND v.district_id = u.district_id
LEFT JOIN (
    SELECT
        a.province_id,
        a.city_id,
        a.district_id,
        sum(a.amount) 'amount_sum'  -- 分組統計值
    FROM
        animal a
    GROUP BY
        a.province_id,
        a.city_id,
        a.district_id
) a ON v.province_id = a.province_id
AND v.city_id = a.city_id
AND v.district_id = a.district_id

-- 注:1. 視圖存放所有不重復的分組情況 2. 必須先統計再連接,即:先求出 分組統計值,然后再左連接;如果先左連接再求統計值,統計值會比實際值大,因為左連接后數據有重復

查詢出來的結果:

可以驗證一下查詢結果是否正確:

money_sum一列的和為15,user表中所有money的和也為15。

amount_sum一列的和為28,animal表中所有的amount值的和也為28。

 

總結:

mysql求全連接,可以先創建所有連接條件的並集,然后其他表都和這個並集進行左連接,即可得出全連接。

 

附:通常的解決方案(適用於語句較少時)

MySQL Full Join的實現

MySQL Full Join的實現 因為MySQL不支持FULL JOIN,下面是替代方法 left join + union(可去除重復數據)+ right join 
兩張表時: select * from A left join B on A.id = B.id (where 條件) union select *
from A right join B on A.id = B.id (where條件);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM