用于以hms格式排序时间的Mysql查询

时间:2015-07-18 07:03:35

标签: php mysql sorting

我正在尝试根据视频的时间对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";

你能帮助我解决问题

1 个答案:

答案 0 :(得分:1)

不幸的是,您的数据不是以最佳方式保存到数据库中。 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

你已经完成了。

欢呼声