php - MySQL 按日期时间字段排序,如果存在相同日期,则使用 Rand()

标签 php mysql

我有一个大约有 10 列的表,其中一列是 date_time 字段。

有时,我需要检索按 date_time DESC 排序的一些行,但如果存在完全相同的两行或更多行,则还需要对它们进行随机排序。

这是我的查询:

SELECT * FROM ads ORDER BY created_at DESC, RAND()

但是,我对其进行了测试,并且始终给出相同的顺序,即使我手动编辑三个字段以具有完全相同的 date_time 值也是如此。如果这些行具有相同的编辑时间,我需要随机排序。

完整查询:

$query = "SELECT items.*, 
              user_data.s_name, 
              user_data.s_email, 
              user_data.s_phone_mobile, 
              item_info.s_title, 
              item_info.s_description,
              item_region.fk_i_region_id,
              pictures.pk_i_id AS picture_name, pictures.s_extension, pictures.s_path,
              (SELECT GROUP_CONCAT(meta.s_value SEPARATOR '|$|') FROM oc_t_item_meta meta WHERE meta.fk_i_item_id = items.pk_i_id) AS metadata
              FROM " . DB_TABLE_PREFIX . "t_item items 
              JOIN " . DB_TABLE_PREFIX . "t_user user_data ON items.fk_i_user_id = user_data.pk_i_id 
              JOIN " . DB_TABLE_PREFIX . "t_item_description item_info ON items.pk_i_id = item_info.fk_i_item_id 
              JOIN " . DB_TABLE_PREFIX . "t_item_location item_region ON items.pk_i_id = item_region.fk_i_item_id
              LEFT OUTER JOIN " . DB_TABLE_PREFIX . "t_item_resource pictures ON items.pk_i_id = pictures.fk_i_item_id
              WHERE items.fk_i_category_id = " . $catId . " 
              AND items.dt_mod_date > '" . $week . " 00:00:00'
              GROUP BY items.pk_i_id
              ORDER BY items.dt_mod_date DESC, RAND()";

谢谢!

最佳答案

由于 RAND 会使您的查询运行速度极其缓慢,因此您可以使用 PHP 进行排序。例如,以下代码将对日期进行降序排序,如果日期相同则进行随机排序:

$data = [
    ['id' => 1, 'dt_mod_date' => '2017-01-01'],
    ['id' => 2, 'dt_mod_date' => '2017-01-01'],
    ['id' => 3, 'dt_mod_date' => '2017-01-01'],
    ['id' => 5, 'dt_mod_date' => '2017-01-03'],
    ['id' => 4, 'dt_mod_date' => '2017-01-02'],
];

usort($data, function ($a, $b) {
    if ($a['dt_mod_date'] === $b['dt_mod_date']) {
        return (bool) mt_rand(0, 1);
    }

    return strtotime($a['dt_mod_date']) < strtotime($b['dt_mod_date']);
});


var_dump($data);

//     Result
//    array(5) {
//        [0] =>
//      array(2) {
//            'id' =>
//        int(5)
//        'dt_mod_date' =>
//        string(10) "2017-01-03"
//      }
//      [1] =>
//      array(2) {
//            'id' =>
//        int(4)
//        'dt_mod_date' =>
//        string(10) "2017-01-02"
//      }
//      [2] =>
//      array(2) {
//            'id' =>
//        int(1)
//        'dt_mod_date' =>
//        string(10) "2017-01-01"
//      }
//      [3] =>
//      array(2) {
//            'id' =>
//        int(3)
//        'dt_mod_date' =>
//        string(10) "2017-01-01"
//      }
//      [4] =>
//      array(2) {
//            'id' =>
//        int(2)
//        'dt_mod_date' =>
//        string(10) "2017-01-01"
//      }
//    }

关于php - MySQL 按日期时间字段排序,如果存在相同日期,则使用 Rand(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155496/

相关文章:

php - 如何在 php 生成的 zip 中排除文件

php - 师生数据库设计

java - Tomcat 连接池、空闲连接和连接创建

PHP PDO execute() 返回重复结果

php - 如何在开源(Github + Heroku)应用程序中保护 Google API Key

mysql - 如何在mysql中使用聚合函数?

php - 用mysql和php打开pdf

php - 无法正确回显数组

php - MySQL 取反值(NOT 运算符)

php - 这个 foreach 循环返回双倍的结果