我正在尝试根据视频的时间对 Mysql 中的数据进行降序排序。
我的数据库中有 Video_Duration 列,我在其中以 hms 格式存储视频的时间(例如 1h54m3s、9m3s、0m3s)。
当我尝试使用下面的查询对数据库进行排序时,我首先得到 9m0s、9m0s 之类的输出,而不是时间更长的时间(例如 1h35m29s)。
我正在使用以下查询对数据库进行排序
$sql = "select * from videos where Category_Name='$category' ORDER BY Video_Duration DESC limit 50";
大家能帮我解决一下吗
最佳答案
不幸的是,您的数据没有以最佳方式保存到数据库中。 varchar 是可排序的,但遵循字母顺序规则。例如,如果我想订购前 12 个数字:
SELECT TOP 12 value
FROM number_in_order
ORDER BY value ASC
我会得到这样的东西:
0
1
10
11
2
3
4
5
6
7
8
9
这是错误的。
处理视频文件长度的正确方法是使用一个 INT 字段来存储秒数,然后通过 php 检索该值并将其格式化为用户可读的方式。
我现在建议的是创建一个名为“NEW_VIDEO_DURATION”的新列,它将是一个 INT,然后使用 PHP 中的一个简单例程从 varchar 列读取数据,在几秒钟内用正确的值填充新列。
你可以做这样的事情来解析你的字符串值:
$stringValue = "1h3m40s";
$h = 0;
$m = 0;
$s = 0;
$splitted = $stringValue.split("h");
if($splitted.length > 0){
$h = $splitted[0];
$splitted = $splitted[1].split("m");
}else{
$splitted = $splitted[0].split("m");
}
$m = $splitted[0];
$s = $splitted[1];
$intValue = ((($h * 60) + $m) * 60) + $s;
现在在 var $intValue 中,您有正确的时间(以秒为单位),可以将其存储在数据库的新列中。
转换完所有值后,您可以删除旧列:
ALTER TABLE table_name
DROP COLUMN video_duration
并将新列重命名为:
ALTER TABLE table_name
RENAME COLUMN new_video_duration to video_duration
大功告成。
干杯
关于php - 以hms格式排序时间的Mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31488728/