我有一个大约有 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/