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