PHP SQL-选择除最高版本外的所有版本

时间:2019-03-23 13:21:05

标签: sql

我在选择所有版本时遇到了麻烦,而不是在使用SQL的数据库中没有最后一个版本。

这是我的数据库的样子:

id | titleid | version
----------------------
1  | TEST1   | 1.27
2  | TEST1   | 1.28
3  | TEST1   | 1.29
4  | TEST1   | 1.30
5  | TEST2   | 1.05
6  | TEST2   | 1.06
7  | TEST2   | 1.07
8  | TEST2   | 1.08

我想选择记录1、2、3、5、6、7,因为它们不是最高版本。

我尝试搜索SO,但似乎找不到与我有相同问题的人。

有人知道我该怎么做吗?非常感谢。

3 个答案:

答案 0 :(得分:4)

这是您想要的吗?

select t.*
from t
where t.version < (select max(t2.version) from t t2 where t2.titleid = t.titleid);

答案 1 :(得分:1)

具有EXISTS:

select * from tablename t
where exists (
  select 1 from tablename
  where titleid = t.titleid and version > t.version
)

答案 2 :(得分:1)

使用ORDER BY,LIMIT和OFFSET

没有提到,虽然不是最注重性能的解决方案

SELECT * FROM foo ORDER BY version DESC LIMIT 1 OFFSET 1

这是最简单的。

Fiddle

排序可能是真正的性能杀手。因此,当然要确保为该版本列建立索引。对于非常简单的应用程序,应该没问题。但是,如果您有成千上万的行,那可能不是最佳选择。

我发现存在速度非常快,但可惜已经采取了。

更新

我想阅读下一个最高版本的问题。但是,除了最高的以外,您可以得到所有,您只需要一个非常大的限制,例如PHP_INT_MAX

  //'SELECT * FROM foo ORDER BY version DESC LIMIT '.PHP_INT_MAX.' OFFSET 1'
 SELECT * FROM foo ORDER BY version DESC LIMIT 9223372036854775807 OFFSET 1

PHP_INT_MAX 是预定义的常量,其值是操作系统可以处理的最大整数(32位和64位系统等)。因此,如果那还不够大……哈哈……将一事无成。