所以我在MySQL(MariaDB)中有2个表。一个具有每行的所有唯一数据,另一个具有第一个表唯一数据的版本历史。 2,GeoID之间只有一个键。
具有唯一ID和GeoID
的表(t1)ID,GeoID,ColumnA,ColumnB
此表(t2)具有版本历史记录。
ID,VersionID,GeoID,TerrainID,Action
所以我在t2上进行LEFT JOIN,其中GeoID在两个表和action = 4中匹配。 问题是因为t2是版本表,它可以返回GeoID匹配的多行,显示所有版本。我需要来自t2的最新版数据与t1连接,而从t1我只需要来自ColumnA的0行
让我们有一些
的值 t1
ID | GeoID | ColumnA | ColumnB
1 | 1000 | 0 | 42
2 | 4387 | 3 | 432
3 | 9573 | 0 | NULL
t2
ID | VersionID | GeoID | TerrainID | Action
1 | 1 | 1000 | 221 | 4
2 | 2 | 1000 | 313 | 2
3 | 1 | 4387 | 541 | 4
4 | 1 | 9573 | 329 | 4
5 | 3 | 1000 | 323 | 4
6 | 2 | 9573 | 423 | 1
现在,我需要返回的是行是GeoID上的JOINed值,来自t2的关联TerrainID以及来自t2的值,其中版本是该大地水准面行的MAX。
所以看起来应该是这样,列上方的表格表示数据的来源。
t1 t2 t2
GeoID | TerrainID | Version
1000 | 323 | 3
9573 | 423 | 2
答案 0 :(得分:0)
针对t2表的GROUPed版本执行LEFT OUTER JOIN应该可以解决这个问题:
SELECT t1.GeoID, t2_grouped.VersionID, t2_grouped.TerrainID
FROM t1
LEFT OUTER JOIN (SELECT GeoID, TerrainID, MAX(VersionID) AS VersionID FROM t2 GROUP BY GeoID, TerrainID) t2_grouped
ON t2_grouped.GeoId = t1.GeoID
WHERE t1.ColumnA = 0
答案 1 :(得分:0)
请尝试:
SELECT
t1.GeoID,
t2_lastver.TerrainID,
t2_lastver.VersionID,
t2_lastver.Action
FROM
t1
LEFT OUTER JOIN
(
SELECT
t2.*
FROM
t2
WHERE
t2.ID in (SELECT MAX(t2_max.ID) FROM t2 AS t2_max WHERE t2_max.GeoID = t2.GeoID)
) AS t2_lastver
ON t2_lastver.GeoID = t1.GeoID
WHERE
t1.ColumnA = 0;
您可以在此处找到说明查询的 SQL Fiddle 。
希望它有所帮助。
答案 2 :(得分:0)
试试这个:
SELECT
t1.GeoID,
t2.TerrainID,
t.Version
FROM t1
LEFT JOIN (
SELECT
GeoID,
Version = MAX(VersionID)
FROM t2
WHERE Action = 4
GROUP BY GeoID
) AS t
ON t.GeoID = t1.GeoID
LEFT JOIN t2
ON t2.GeoID = t.GeoID
AND t2.VersionId = t.Version
WHERE
t1.ColumnA = 0