如何选择一列中的最大值,然后选择另一列中的最大值?

时间:2014-12-06 16:53:14

标签: php mysql

我的桌子看起来像这样:

ID  quote_no  version
------------------------
1   123       1
2   123       2
3   123       1
4   123       2
5   321       1
6   321       1

我想选择每个报价的最新版本,如果该版本的多个记录我想获得具有最高ID的行。

(在这种情况下,查询应该产生以下结果):

ID  quote_no  version
------------------------
4   123       2
6   321       1

我怎么能在查询中这样做?

4 个答案:

答案 0 :(得分:2)

您可以使用not exists子句来解决此问题:

select t.*
from table t
where not exists (select 1
                  from table t2
                  where t2.quote_no = t.quote_no and
                        (t2.version > t.version or
                         t2.version = t.version and t2.id > t.id
                        )
                 );

如果你只想要一个id最高的那个(这也与你的结果一致),你可以这样做:

select t.*
from table t join
     (select quote_no, max(id) as maxid
      from table t
      group by quote_no
     ) tt
     on t.id = tt.maxid;

答案 1 :(得分:2)

我会编写一个子查询,为每个quote_no获取最大版本,如下所示:

SELECT quote_no, MAX(version) AS maxVersion
FROM myTable
GROUP BY quote_no;

您可以将其与原始表一起使用,并使用另一个MAX()函数来获取最大的ID:

SELECT MAX(m.id), m.quote_no, mt.maxVersion
FROM myTable m
JOIN(
  SELECT quote_no, MAX(version) AS maxVersion
  FROM myTable
  GROUP BY quote_no) mt ON mt.quote_no = m.quote_no AND mt.maxVersion = m.version
GROUP BY m.quote_no;

SQL Fiddle中正常工作。

答案 2 :(得分:1)

每组最新的X记录在MySQL中是一个棘手的问题,除非在你的情况下X为1。你可以这样做。对于每个引用,请加入具有相同quote_no但更高版本的所有行,或者具有相同版本但具有更大ID的行。然后,您可以应用过滤器,仅保留那些不具有更高版本的行:

SELECT
  t1.*
FROM  
  YourTable t1
  LEFT JOIN YourTable t2 ON
       t2.quote_no = t1.quote_no AND -- Quote must match anyway
       ( t2.version > t1.version OR -- Version must be larger
         ( t2.version = t1.version AND -- Or if version is the same... 
           t2.ID > t1.ID )      -- ID must be larger.
WHERE
  t2.quote_no IS NULL

答案 3 :(得分:-2)

尝试类似的东西:

SELECT t2.* 
FROM QuoteTable t2
JOIN (SELECT 
              MAX(ID) AS t1.LatestId,
              quote_no
              FROM QuoteTable t1
              GROUP BY quote_no)
ON t2.id = t1.LatestId;

编辑:父SELECT语句可防止版本号错误。