簡體   English   中英

SQL 連接和多對多查詢

[英]SQL join and many to many queries

鑒於我有以下表格和記錄,我有興趣獲得該機構同時為美國宇航局和歐洲航天局的所有任務。 我已經寫了一個內部連接語句,但我不知道如何將其縮小到我正在尋找的結果。 僅供參考,我正在使用sqlite

任務表

CREATE TABLE mission_agencies (
    id INTEGER NOT NULL, 
    name VARCHAR(250), 
    PRIMARY KEY (id)
)
id    name
1     m1
2     m2
3     m3
4     m4
5     m5

宣教機構表

CREATE TABLE missions (
    _id INTEGER NOT NULL, 
    name VARCHAR(36) NOT NULL, 
    PRIMARY KEY (_id)
)
id    name
1     Nasa
2     Esa
3     Jax

任務所有權表(關聯表)

CREATE TABLE mission_ownership (
    mission_id INTEGER, 
    mission_agency_id INTEGER, 
    FOREIGN KEY(mission_id) REFERENCES missions (id), 
    FOREIGN KEY(mission_agency_id) REFERENCES mission_agencies (id)
)
mission_id      mission_agency_id
1               1
2               1
3               1
4               2
1               2
5               3

我當前的 SQL 語句是這樣的:

SELECT *
FROM missions
INNER JOIN mission_ownership
ON missions._id = mission_ownership.mission_id
INNER JOIN mission_agencies
ON mission_agencies._id = mission_ownership.mission_agency_id

這會產生一個像這樣的表:

id   name     mission_id    mission_agency_id     id    name
1    m1       1             1                     1     Nasa
2    m2       2             1                     1     Nasa
3    m3       3             1                     1     Nasa
4    m4       4             2                     2     Esa
1    m1       1             2                     2     Esa
5    m5       5             3                     3     Jax

現在我喜歡運行一個查詢,查詢 Nasa 和 Esa 已經完成的所有任務,唯一滿足此條件的任務是m1 ,因此我的目標結果集應如下所示:

id   name     mission_id    mission_agency_id     id    name
1    m1       1             1                     1     Nasa
1    m1       1             2                     2     Esa

我該如何編寫這樣的查詢?

如果您運行的是 MySQL 8.0,這里有一種使用窗口函數的方法:

select *
from (
    select *, count(*) over(partition by m.id) cnt
    from missions m
    inner join mo on m.id = mo.mission_id
    inner join ma on ma.id = mo.mission_agency_id
    where ma.name in ('Nasa', 'Esa')
) t
where cnt > 1

這個想法是根據您感興趣的機構過濾您當前的結果集,並計算每個任務剩余的行數。 然后,我們可以過濾具有這兩個機構的任務。

請注意,這假設沒有重復的任務/機構。

按照此處建議的過濾和計數行的想法,我發現了一個這樣的查詢:

SELECT COUNT(mid), mname
FROM(
    SELECT missions._id AS mid, missions.name AS mname
    FROM missions
    INNER JOIN mission_ownership
    ON missions._id = mission_ownership.mission_id
    INNER JOIN mission_agencies
    ON mission_agencies._id = mission_ownership.mission_agency_id
    WHERE mission_agencies.name = 'Esa' or mission_agencies.name = 'Jax'
    )
GROUP BY mid
HAVING COUNT(mid) > 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM