MySQL Return 基于列最大值的不同行
MySQL Return Distinct rows based on highest value of column
所以我在 MySQL (MariaDB) 中有 2 个 table。一个具有每行所有唯一数据,另一个具有第一个 tables 唯一数据的版本历史记录。 2之间只有一个key,GeoID。
具有唯一 ID 和 GeoID 的 table (t1)
ID , GeoID , ColumnA , ColumnB
这个table(t2)有版本历史。
ID , VersionID , GeoID , TerrainID , Action
所以我在 t2 上进行了 LEFT JOIN,其中 GeoID 在 tables 和 action = 4 中都匹配。
问题是,因为 t2 是一个版本 table,它可以 return 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
现在,我需要的是return行是 GeoID 上的 JOINed 值、来自 t2 的相关 TerrainID 以及来自 t2 的值,其中版本是该大地水准面行的 MAX。
所以它应该看起来像这样,table 上面的列表示数据的来源。
t1 t2 t2
GeoID | TerrainID | Version
1000 | 323 | 3
9573 | 423 | 2
对 t2 的 GROUPed 版本进行 LEFT OUTER JOIN table 应该可以解决问题:
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
请尝试:
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 说明查询。
希望对您有所帮助。
试试这个:
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
所以我在 MySQL (MariaDB) 中有 2 个 table。一个具有每行所有唯一数据,另一个具有第一个 tables 唯一数据的版本历史记录。 2之间只有一个key,GeoID。
具有唯一 ID 和 GeoID 的 table (t1)
ID , GeoID , ColumnA , ColumnB
这个table(t2)有版本历史。
ID , VersionID , GeoID , TerrainID , Action
所以我在 t2 上进行了 LEFT JOIN,其中 GeoID 在 tables 和 action = 4 中都匹配。 问题是,因为 t2 是一个版本 table,它可以 return 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
现在,我需要的是return行是 GeoID 上的 JOINed 值、来自 t2 的相关 TerrainID 以及来自 t2 的值,其中版本是该大地水准面行的 MAX。
所以它应该看起来像这样,table 上面的列表示数据的来源。
t1 t2 t2
GeoID | TerrainID | Version
1000 | 323 | 3
9573 | 423 | 2
对 t2 的 GROUPed 版本进行 LEFT OUTER JOIN table 应该可以解决问题:
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
请尝试:
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 说明查询。
希望对您有所帮助。
试试这个:
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