我在选择所有版本时遇到了麻烦,而不是在使用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,但似乎找不到与我有相同问题的人。
有人知道我该怎么做吗?非常感谢。
答案 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
这是最简单的。
排序可能是真正的性能杀手。因此,当然要确保为该版本列建立索引。对于非常简单的应用程序,应该没问题。但是,如果您有成千上万的行,那可能不是最佳选择。
我发现存在速度非常快,但可惜已经采取了。
更新
我想阅读下一个最高版本的问题。但是,除了最高的以外,您可以得到所有,您只需要一个非常大的限制,例如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位系统等)。因此,如果那还不够大……哈哈……将一事无成。