MySQL在选择之前排序

时间:2013-09-11 09:09:21

标签: mysql

我有一个MySQL表,它将对象的出生和死亡事件存储为单独的行。我正在尝试编写一个查询,它将在给定时间获得所有“生活对象”。踢球者的出生和死亡时间戳存储为字符串。

系统具有历史方面,需要从00:00开始的日期,MySQL或UNIX都无法处理。

我可以使用以下内容成功对表进行排序:

ORDER BY CHAR_LENGTH(start_timestamp) ASC, start_timestamp ASC

但我正在寻找一个在比较字符串时会包含此ORDER BY规则的查询。

我目前的职能如下:

global $mysqli,$db_table_prefix;
$stmt = $mysqli->prepare("SELECT object_id FROM ".$db_table_prefix."user_events WHERE start_timestamp < ? AND event_id = ?");
$stmt->bind_param("ii",$time,$birth);
$stmt->execute();
$stmt->bind_result($object_id);
while ($stmt->fetch()){
    $row[] = $object_id;
}
$stmt->close(); 

    if(!empty($row)){
        $stmt = $mysqli->prepare("SELECT object_id FROM ".$db_table_prefix."user_events WHERE start_timestamp > ? AND event_id = ? AND object_id IN (".join(",",$row).")");
        $stmt->bind_param("ii",$time,$death);
        $stmt->execute();
        $stmt->bind_result($object_id);
        while ($stmt->fetch()){
            $row2[] = array("object_id" => $object_id);
        }
        $stmt->close();
        if(!empty($row2)){
            return $row2;
        }else{
            return FALSE;
        }

这里的问题是MySQL没有按照我想要的方式比较字符串。所以一串“1000000000”(10)小于“900000000”(9)。

有没有办法做到这一点:

WHERE start_timestamp > ?

遵循与此相同的规则:

ORDER BY CHAR_LENGTH(start_timestamp) ASC, start_timestamp ASC

查询时?

1 个答案:

答案 0 :(得分:1)

您可以对它们进行zeropad然后进行比较:

LPAD(start_timestamp,20,'0') > LPAD(another_timestamp,20,'0')

20个字符的限制是任意的,您应该根据需要进行更改。

此外,它可能会让您的生活更容易在表格中存储填充值。