Mysql SQL:4个表到1个表,包含计数、组和扣减?!
我有一个关于机场失物招领和匹配行李的项目。我用Java(FX)和mySQL制作了它 这就是我所拥有的: 我有4张桌子: 1表2列: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
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
子句中的子表上添加条件。