【问题标题】:MySQL - ORDER BY STR_TO_DATE not workingMySQL - ORDER BY STR_TO_DATE 不起作用
【发布时间】:2014-08-03 20:43:21
【问题描述】:

我正在尝试使用 PHP 和 MySql 运行 PDO 查询,然后按日期对其进行排序。

我的查询如下:

    $query_params = array( 
        ':website' => $site
    );

    $query = " 
        SELECT 
            DATE_FORMAT(date, '%d/%m/%Y') AS date,
            id
        FROM
            items as bi
        INNER JOIN 
            basket as bb ON bi.item_number=bb.basket_item
        INNER JOIN
            orders as bo ON bb.basket_order=bo.order_number 
        WHERE
            bi.website = :website
        ORDER BY 
            STR_TO_DATE(date,'%d/%m/%Y') DESC
    "; 

    try { 
        $stmt = DB::get()->prepare($query); 
        $stmt->execute($query_params); 
        $rows = $stmt->fetchAll();
    } 
    catch(PDOException $ex) {} 

    foreach($rows as $row):
        $output .= "".$row["date"].",";
        $output .= "".$row["id"].",";
        $output .= "\r\n <br />";
    endforeach;

我的输出应该在哪里:

13/06/2014, 8676,
12/06/2014, 5765,
12/04/2014, 7683, 
08/12/2013, 1098, 
06/12/2013, 2003, 
06/12/2013, 6755,

它似乎没有按任何排序:

12/06/2014, 5765,
12/04/2014, 7683, 
13/06/2014, 8676, 
06/12/2013, 2003, 
06/12/2013, 6755, 
08/12/2013, 1098,

STR_TO_DATE(date,'%d/%m/%Y') DESC不应该按预期排序吗?

【问题讨论】:

    标签: php mysql sql-order-by str-to-date


    【解决方案1】:

    您的表中已经有一个可爱的日期列 - 为什么要尝试根据该格式的字符串进行排序?

        SELECT 
            DATE_FORMAT(date, '%d/%m/%Y') AS date,
            id
        FROM
            items as bi
        INNER JOIN 
            basket as bb ON bi.item_number=bb.basket_item
        INNER JOIN
            orders as bo ON bb.basket_order=bo.order_number 
        WHERE
            bi.website = :website
        ORDER BY 
            date DESC
    

    当然,根据您的喜好格式化输出给用户的日期 - 但您不仅可以通过格式化每行数据然后按数据库可以按原样完成的方式进行排序,从而使数据库做更多事情本来就是。

    编辑:有趣。我想知道date 是一个半保留词这一事实是否会导致您的排序没有按预期发生?

    不妨试试这个:

        ORDER BY 
            bo.date DESC
    

    【讨论】:

    • 当我使用上面的命令时,它按 desc 顺序排列我的日期,但不考虑月份和年份,所以它只按天排序。我的日期字段的类型为datetime,类型为 0000-00-00 00:00:00(我无法更改),所以我的理论是首先去掉 SELECT 部分中的时间,然后在最后排序
    • @odd_duck 按日期字段排序肯定会考虑日期和月份 - 它会考虑字段中的所有内容。
    • @Fluffeh 奇怪的是我的排序不正确。我的日期列在orders 表中(最后一个连接)而不是在第一个items 表中这一事实是否与此有关?
    • 啊,添加 bo.date DESC 就可以了——现在按预期排序,谢谢
    • @odd_duck 没问题 - 真的,如果您已经拥有完美格式化的数据(例如日期),请尝试让数据库尽其所能使用它:)
    【解决方案2】:

    试试这个

    $query = " 
        SELECT 
            DATE_FORMAT(date, '%d/%m/%Y') AS date,
            id
        FROM
            items as bi
        INNER JOIN 
            basket as bb ON bi.item_number=bb.basket_item
        INNER JOIN
            orders as bo ON bb.basket_order=bo.order_number 
        WHERE
            bi.website = :website
        ORDER BY 
            date DESC
    "; 
    

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      相关资源
      最近更新 更多