我有一个关于机场失物招领和匹配行李的项目。我用 Java(FX) 和 mySQL 制作的。
这就是我所拥有的: 我有 4 张 table :
1 个表机场有 2 列:
Airport_id & Airport_name
找到 1 个包含 3 列的表:
Found_id & Found_AirportID & Matched
1 个表丢失了 3 列:
Lost_id & Lost_AirportID & Matched
1 个表格匹配 3 列:
Match_id & Match_LostID & Match_FoundID & Match_AirportID
每当进行匹配时,匹配表都会获得一个新行,其中包含 Match_LostID(来自 Lost_id)和 Match_FoundID(来自 Found_id)以及 Match_AirportID(Found_AirportID) 匹配的(在“找到”和“丢失”中)都设置为 1,而不是 NULL
所有 AirportID 都链接到 Airport 表。
我想要什么; 对于每个机场,我想要丢失元素的数量、找到元素的数量以及匹配元素的数量。但是,当元素“匹配”时,它可能不会出现在失物招领的计数中。
所以我想要一个有 4 列的表格: 机场名称、找到数、丢失数、匹配数。
我做了以下查询:
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
我设法获取“找到”、“丢失”和“匹配”的所有计数项目。
例如纽约有 2 场找到,2 场失利,1 场比赛。
这在表中正确显示。 但正如我所说,如果存在匹配项,则应将其从“找到”和“丢失”中删除。应该是:
纽约有 1 次找到,1 次丢失,1 次匹配。
我尝试了很多事情,有一次我设法做到了,但后来机场丢失了,或者它从“找到”中扣除,但不是因为丢失......
我不知道解决方案是什么,有人可以解释/给我吗?
提前致谢,
LTKort
最佳答案
将 Matched IS NULL
检查放入 LEFT JOIN
的 ON
条件中,而不是 WHERE
中。
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
在 WHERE
中执行此操作的问题是,您只能获得与 Lost
或 Found
项目匹配的结果。
关于mysql - SQL:4 个表到 1 个表,包含计数、分组和扣除?!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41642327/