我有2个表,其中包含以下信息。不幸的是,我对JOINS和MySQL的基本了解并不能帮助我达到所需的结果集……尤其是第3点使我难以理解。任何帮助将不胜感激。
订单
OrderID OrderDate Client Country
68349 1/1/2018 GSC Ltd US
93909 1/1/2018 XYZ Ltd UK
39900 3/31/2018 ABC Ltd US
69382 4/4/2018 ABC Ltd US
94500 6/21/2018 DEF Ltd US
93911 1/1/2018 TUV Ltd UK
报告
RepID State RepDate Building OrderID
1 AK 1/1/2018 PE James 93909
2 CA 4/2/2018 PE Grid 93909
3 CA 3/31/2018 PMU Jaya 39900
4 WA 4/4/2018 PMU Taman 69382
5 CA 6/21/2018 PE Grid 94500
6 CA 3/31/2018 PMU Wate 39900
我需要根据选择所有内容:
结果将是:
OrderID OrderDate Client Country RepID RepDate Building
68349 1/1/2018 GSC Ltd US - - -
39900 3/31/2018 ABC Ltd US 3 3/31/2018 PMU Jaya
69382 4/4/2018 ABC Ltd US 4 4/4/2018 PMU Taman
94500 6/21/2018 DEF Ltd US 5 6/21/2018 PE Grid
由于没有关于“ PE Grid”的最新报告,因此以下结果将被排除:
OrderID OrderDate Client Country RepID RepDate Building
39900 3/31/2018 ABC Ltd US 6 3/31/2018 PE Grid
答案 0 :(得分:0)
在这里找到每个建筑物的最新报告是一个窍门。首先,您需要像这样查找最新报告的日期。
SELECT MAX(RepDate) RepDate, Building
FROM reports
GROUP BY RepDate
GROUP BY保证每个建筑物在这里只有一行。
然后,您需要将该查询视为虚拟表并将其联接。 (http://sqlfiddle.com/#!9/ade437e/2/0)
SELECT o.OrderID, o.OrderDate, o.Client, o.Country,
r.RepId, r.RepDate, r.Building
FROM orders o
LEFT JOIN reports r ON o.OrderID = r.OrderID
LEFT JOIN ( SELECT MAX(RepDate) RepDate, Building
FROM reports
GROUP BY RepDate
) m ON r.RepDate = m.RepDate AND r.Building = m.Building
请注意此处使用LEFT JOIN
。这意味着没有匹配报告的订单仍将显示在结果集中。如果您不希望这些订单,请将LEFT JOIN
更改为JOIN
。
如果要过滤该结果集,请在查询的末尾添加WHERE o.Country = 'US'
(或您选择的过滤器)。然后,您可以根据需要使用ORDER BY
对结果集进行排序。
诀窍是从内到外构建查询。
顺便说一下,这称为greatest n per group模式。