PHP Mysql按日期排序

PHP Mysql按日期排序,php,mysql,Php,Mysql,这是我的sql查询 CREATE TABLE IF NOT EXISTS `categories` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `revise_price_option` int(1) NOT NULL, `sale_start_date` datetime NOT NULL, `sale_end_date` datetime NOT NULL

这是我的sql查询

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `revise_price_option` int(1) NOT NULL,
  `sale_start_date` datetime NOT NULL,
  `sale_end_date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
INSERT INTO `categories` (`id`, `name`, `revise_price_option`, `sale_start_date`, `sale_end_date`) VALUES
(1, 'Subwoofers', 1, '2014-04-02 08:00:00', '2014-04-02 14:00:00'),
(2, 'Speakers', 1, '2014-04-02 12:00:00', '2014-04-02 14:05:00'),
(3, 'test', 1, '2014-04-03 10:00:00', '2014-04-04 12:00:00'),
(4, 'Amplifiers', 1, '2014-04-02 10:30:00', '2014-04-02 14:05:00'),
(5, 'atest1', 1, '2014-04-02 16:30:00', '2014-04-03 17:00:00');
这里我想按日期排序。 如果开始日期和结束日期小于当前日期,则应说明开始日期和结束日期的最近日期应在顶部,过期日期应在底部

我的问题是:

SELECT * FROM categories WHERE revise_price_option='1' ORDER BY sale_start_date, sale_end_date

这有点棘手,因为不能将排序的
desc
asc
部分设为条件。所以,首先把过期的放在第一位。然后按desc排序,其余按升序排序:

SELECT *
FROM categories
WHERE revise_price_option='1'
ORDER BY (sales_start_date < now() and sale_end_date < now()) desc,
         (case when (sales_start_date < now() and sale_end_date < now())
               then sale_start_date
          end) desc
         sale_start_date asc;
选择*
从类别
在哪里修改价格选项='1'
订单依据(销售开始日期<现在()和销售结束日期<现在())说明,
(销售开始日期<现在()和销售结束日期<现在()时的情况)
然后销售开始日期
完)描述
销售开始日期asc;

您可以使用php if-else执行要使用的查询。 示例结构:

    if(start_date < current date){
    //execute query DESC
    }
    else{
    //execute query ASC
    }
if(开始日期<当前日期){
//执行查询描述
}
否则{
//执行查询ASC
}

如果我真的理解了您的意思,这应该可以满足您的要求:

SELECT * FROM categories WHERE sale_start_date <= NOW() AND sale_end_date <= NOW() ORDER BY sale_start_date DESC, sale_end_date DESC

SELECT*FROM categories WHERE sale_start_date以下是代码,其中过期日期将列在下面,未过期日期将列在前面或前面

SELECT *
FROM categories
WHERE revise_price_option='1'
ORDER BY 
(sale_start_date > now() and sale_end_date > now()) desc;
这里是

试试这个-

SELECT * FROM categories
WHERE revise_price_option=1
ORDER BY sale_start_date, sale_end_date
CASE WHEN (sale_start_date < NOW() AND sale_end_date < NOW()) THEN desc ELSE asc END 
从类别中选择*
其中,修订价格选项=1
按销售开始日期、销售结束日期排序的订单
(销售开始日期<现在()和销售结束日期<现在())然后描述其他asc结束时的情况

那么问题是什么?你的实际结果是什么?预期结果是什么?首先显示过去日期,我希望比当前日期更多的日期应该是顶部,过去日期应该是底部