MySQL返回基于列的最高值的不同行

时间:2015-01-07 01:52:00

标签: mysql join distinct

所以我在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

3 个答案:

答案 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