[英]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.