【问题标题】:MySQL SELECT unique column where other column is maxMySQL SELECT 唯一列,其中其他列最大
【发布时间】:2012-12-19 01:09:07
【问题描述】:

我有这样的桌子

  id     |     serial_num     |      version     | .....
  1      |         1          |          1       | .....
  2      |         2          |          1       | .....
  3      |         2          |          2       | .....
  4      |         3          |          1       | .....
  5      |         4          |          1       | .....
  6      |         5          |          1       | .....
  7      |         5          |          2       | .....
  8      |         5          |          3       | .....

现在我要选择的是获取具有最大版本和唯一序列号的行...

结果是:

  id     |     serial_num     |      version     | .....
  1      |         1          |          1       | .....
  3      |         2          |          2       | .....
  4      |         3          |          1       | .....
  5      |         4          |          1       | .....
  8      |         5          |          3       | .....

我的 SQL 有点复杂,这就是为什么我不使用 MAX() 解决问题的原因...我几乎没有左连接等...

有什么想法吗?

最好的问候,感谢您的宝贵时间!

【问题讨论】:

  • 您能否再解释一下结果,您要达到什么目的?
  • 当然......抱歉之前没有解释......它应该作为带有附加日期的修订系统(标记为......)......此时我想选择所有新数据(MAX版本)并且我希望它是唯一的(serial_num)......我不想使用MAX()来解决这个问题,因为我可能会得到错误的数据......比如说SELECT id,MAX(version),MAX( serial_num) from t GROUP BY serial_num 可能会返回错误的 ID,因为它不在 MAX() 中......我希望我解释得很好......
  • 您如何确定选择哪个id 来作为唯一的serial_num?例如似乎每个唯一的 serial_num 都是 max(id)

标签: mysql select unique max


【解决方案1】:

试试这个:

SELECT yourtable.*
FROM yourtable
WHERE (serial_num, version) in (select serial_num, max(version)
                                from yourtable
                                group by serial_num)

子查询将返回 serial_num 的最大版本,因此这将返回 serial_num 具有最大值的所有行。见this fiddle

【讨论】:

  • 为什么不直接使用这个? select id, serial_num, max(version) AS Version from yourtable group by serial_num
  • 太棒了!这行有效……现在我又想到了一个……我也有日期列……并且在新年计数器上重置 serial_num ……我也应该以某种方式检查一下……
  • @M.V.感谢您的确认。那是我最初的查询。我必须为你添加max(id)
  • 如果我也有日期值怎么办?任何想法?可以是 (DATE, SERIAL, VERSION) (2012, 1, 1), (2012, 2, 1), (2013, 1, 1)
  • SELECT yourtable.* FROM yourtable WHERE (yeartime, serial_num, version) in (select yeartime, serial_num, max(version) from yourtable group by yeartime, serial_num)
【解决方案2】:

您可以使用子查询来查找最大值,然后加入您的表:

select t1.id,
  t1.serial_num,
  t1.version
from yourtable t1
inner join
(
  select serial_num, 
    max(version) version
  from yourtable
  group by serial_num
) t2
  on t1.serial_num = t2.serial_num
  and t1.version = t2.version

SQL Fiddle with Demo

结果:

| ID | SERIAL_NUM | VERSION |
-----------------------------
|  1 |          1 |       1 |
|  3 |          2 |       2 |
|  4 |          3 |       1 |
|  5 |          4 |       1 |
|  8 |          5 |       3 |

【讨论】:

    【解决方案3】:

    通过查询为组选择id 是没有用的。您应该只选择您在 group by 中使用的列以及正在应用聚合函数的其他列。

    希望this works为你服务。

    SELECT id, 
           serial_num, 
           Max(`version`) `version`
    FROM   tbl1 
    GROUP  BY serial_num 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 2023-03-15
      • 2018-11-19
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      相关资源
      最近更新 更多