MySQL在选择之前排序

MySQL在选择之前排序,mysql,Mysql,我有一个MySQL表,它将对象的出生和死亡事件存储为单独的行。我正在尝试编写一个查询,该查询将在给定时间获取所有“活动对象”。更重要的是,出生和死亡时间戳存储为字符串 系统具有历史特性,要求日期从0000-00-00:00开始,MySQL和UNIX都无法处理 我可以通过以下方法成功地对表进行排序: ORDER BY CHAR_LENGTH(start_timestamp) ASC, start_timestamp ASC global $mysqli,$db_table_prefix; $st

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

系统具有历史特性,要求日期从0000-00-00:00开始,MySQL和UNIX都无法处理

我可以通过以下方法成功地对表进行排序:

ORDER BY CHAR_LENGTH(start_timestamp) ASC, start_timestamp ASC
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;
        }
但是我正在寻找一个查询,当比较字符串时,它将合并这个顺序的规则

我目前的职能如下:

ORDER BY CHAR_LENGTH(start_timestamp) ASC, start_timestamp ASC
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;
        }
遵循与此相同的规则:

ORDER BY CHAR_LENGTH(start_timestamp) ASC, start_timestamp ASC

查询时?

您可以将它们归零,然后比较:

LPAD(start_timestamp,20,'0') > LPAD(another_timestamp,20,'0')
20个字符的限制是任意的,您应该根据需要进行更改


此外,在表中存储填充值可能会使您的生活更轻松。

您可以将它们归零,然后比较:

LPAD(start_timestamp,20,'0') > LPAD(another_timestamp,20,'0')
20个字符的限制是任意的,您应该根据需要进行更改


另外,将填充值存储在表中可能会使您的工作更轻松。

您可以将它们归零,然后比较-
LPAD(开始时间戳,20,'0')>LPAD(另一个时间戳,20,'0')
。20个字符的限制是任意的,您应该根据需要进行更改。另外,在表格中存储填充值可能会使您的生活更轻松。@Vatev-感谢您的回复,它起到了作用。你能把它作为一个正式的答复贴出来,这样我就可以接受了您可以将它们归零,然后比较-
LPAD(开始时间戳,20,'0')>LPAD(另一个时间戳,20,'0')
。20个字符的限制是任意的,您应该根据需要进行更改。另外,在表格中存储填充值可能会使您的生活更轻松。@Vatev-感谢您的回复,它起到了作用。你能把它作为一个正式的答复贴出来,这样我就可以接受了