Mysql SQL:4个表到1个表,包含计数、组和扣减?!

Mysql SQL:4个表到1个表,包含计数、组和扣减?!,mysql,sql,Mysql,Sql,我有一个关于机场失物招领和匹配行李的项目。我用Java(FX)和mySQL制作了它 这就是我所拥有的: 我有4张桌子: 1表2列: Airport_id & Airport_name Found_id & Found_AirportID & Matched Lost_id & Lost_AirportID & Matched Match_id & Match_LostID & Match_FoundID & Match_Air

我有一个关于机场失物招领和匹配行李的项目。我用Java(FX)和mySQL制作了它

这就是我所拥有的: 我有4张桌子:

1表2列:

Airport_id & Airport_name
Found_id & Found_AirportID & Matched
Lost_id & Lost_AirportID & Matched
Match_id & Match_LostID & Match_FoundID & Match_AirportID
找到1个包含3列的表:

Airport_id & Airport_name
Found_id & Found_AirportID & Matched
Lost_id & Lost_AirportID & Matched
Match_id & Match_LostID & Match_FoundID & Match_AirportID
1个表丢失,共3列:

Airport_id & Airport_name
Found_id & Found_AirportID & Matched
Lost_id & Lost_AirportID & Matched
Match_id & Match_LostID & Match_FoundID & Match_AirportID
1个表与3列匹配:

Airport_id & Airport_name
Found_id & Found_AirportID & Matched
Lost_id & Lost_AirportID & Matched
Match_id & Match_LostID & Match_FoundID & Match_AirportID
无论何时进行匹配,匹配表都会获得一个新行,其中包含match\u LostID(来自丢失的\u id)&match\u FoundID(来自找到的\u id)和match\u AirportID(来自找到的\u AirportID) 匹配的(在查找和丢失中)将两者都设置为1,而不是NULL

所有AirportID都链接到Airport表

我想要什么; 对于每个机场,我想要丢失物品的数量、找到物品的数量和匹配物品的数量。但当一件物品“匹配”时,它可能不会出现在失物招领处的计数中

所以我想要一个有4列的表: Airportname、找到的计数、丢失的计数、匹配的计数

我提出了以下问题:

SELECT vv.Airport_name, 
COUNT(DISTINCT gb.Found_id) countFound, 
COUNT(DISTINCT vb.Lost_id) countLost, 
COUNT(DISTINCT kt.Match_id) countMatch
FROM Airports vv
LEFT JOIN Found gb ON vv.Airport_id = gb.Found_AirportID
LEFT JOIN Lost vb ON vv.Airport_id = vb.Lost_AirportID
LEFT JOIN Match kt ON vv.Airport_id = kt.Match_AirportID
WHERE vb.Matched IS NULL OR gb.Matched IS NULL
GROUP BY vv.Airport_name
我设法得到所有计数项目的发现,丢失和匹配

e、 纽约队有2场失利,2场失利和1场比赛

这将在表中正确显示。 但正如我所说,如果有匹配项,则应将其从“发现”和“丢失”中删除。应该是:

纽约队有1场失利,1场失利和1场比赛

我尝试了很多事情,有一次我成功地做到了,但是机场不见了,或者从发现中扣除了,但不是因为丢失了

我不知道解决办法是什么,有人能给我解释一下吗

提前感谢,


LTKort

匹配为空
检查
左连接的
条件,而不是
其中的

SELECT vv.Airport_name, 
    COUNT(DISTINCT gb.Found_id) countFound, 
    COUNT(DISTINCT vb.Lost_id) countLost, 
    COUNT(DISTINCT kt.Match_id) countMatch
FROM Airports vv
LEFT JOIN Found gb ON vv.Airport_id = gb.Found_AirportID AND gb.Matched IS NULL
LEFT JOIN Lost vb ON vv.Airport_id = vb.Lost_AirportID AND vb.Matched IS NULL
LEFT JOIN Match kt ON vv.Airport_id = kt.Match_AirportID
GROUP BY vv.Airport_name

<> >在<>代码> <代码>中的问题是,您只得到了“<代码>丢失< /代码>或<代码>发现< /代码>项匹配的结果。

< P>可选地,考虑加入聚合的派生表,以避免在<代码>计数(< /代码>)中的多对多连接:评价:

SELECT a.AirportName, ftbl.countFound, lbtl.countLost, mtbl.countMatched
FROM Airports a
LEFT JOIN
   (SELECT f.Found_AirportID, COUNT(f.Found_id) AS countFound 
    FROM Found f
    WHERE f.Matched IS NULL
    GROUP BY f.Found_AirportID) As ftbl
ON a.Airport_id = ftbl.Found_AirportID

LEFT JOIN
   (SELECT l.Lost_AirportID, COUNT(l.Lost_id) AS countLost 
    FROM Lost l
    WHERE l.Matched IS NULL
    GROUP BY l.Lost_AirportID) As ltbl
ON a.Airport_id = ltbl.Lost_AirportID

LEFT JOIN
   (SELECT m.Match_AirportID, COUNT(m.Match_id) AS countMatched 
    FROM Matched m
    GROUP BY m.Match_AirportID) As mtbl
ON a.Airport_id = mtbl.Match_AirportID

我错了,但这不等于在OP的
WHERE
子句中将
更改为
。但一般来说,在执行
左连接时,应该在
on
子句中的子表上添加条件。