【问题标题】:Complex MySQL SORT based on time基于时间的复杂 MySQL SORT
【发布时间】:2012-03-25 20:49:08
【问题描述】:

我必须根据 unix 时间字段对 MySQL 记录进行排序。但是,有些记录的值是 1 而不是时间。以下是我希望它们排序的方式,假设当前时间是 125:

127
130
132
133
1
1
1
1
124
122
119

如您所见,最上面的部分是按时间字段顺序排列的 ASC 记录,其中时间最早的在前,然后是所有标记为 1 而不是正确时间的记录,然后是来自按 DESC 顺序过去。这可行吗?

【问题讨论】:

  • 可能有两个单独的查询,考虑到订单发生变化

标签: php mysql sorting select mysqli


【解决方案1】:

您可以使用以下代码执行此操作:

drop table if exists numbers;
create table numbers ( value int );
insert into numbers values 
(119),(122),(124),(127),(130),(131),(1),(1),(1),(1);

select 
    value 
from numbers
order by if( value = 1, 125, if( value > 125, 99999 - value, value ) )  desc

产生:

value
-----
127
130
131
1
1
1
1
124
122
119

只需将所有出现的125 替换为当前时间,将“99999”替换为您在表中可能遇到的最大时间值。

【讨论】:

  • 那么对于最大的价值我可以做 MAX 吗?
  • MAX() 不起作用,但我添加了一个大数字(3000000000)并从中减去值,它就像一个魅力。谢谢。
【解决方案2】:

不确定是否有一个 mysql 查询,但我已经尝试了 php 和 mysql 的一些东西,所以试试这个希望它可以帮助你

假设表名为测试,字段名为日期和时间为125

    $get_latest = mysql_query("SELECT * FROM `test` WHERE time > 125 ORDER BY time ASC");
while($row = mysql_fetch_assoc($get_latest))
{
    $result[] = $row['time'];
}
$get_remaining = mysql_query("SELECT * FROM `test` WHERE time <= 125 ORDER BY time ASC");
while($row1 = mysql_fetch_assoc($get_remaining))
{
    $result[] = $row1['time'];
}

foreach($result as $r)
{
    echo $r.'<br />';
}

【讨论】:

  • 对不起,我几乎可以使用 MySQL ORDER BY,所以我知道它可以在没有 PHP 的情况下完成。请参阅上面的另一个答案。不过感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
相关资源
最近更新 更多