Php MySQL按日期排序,直到某个特定日期,之后按相反顺序排序

Php MySQL按日期排序,直到某个特定日期,之后按相反顺序排序,php,mysql,sql,mysql-workbench,navicat,Php,Mysql,Sql,Mysql Workbench,Navicat,好的,我有一张这样的桌子 +----+-------+------------+ | id | title | date | +----+-------+------------+ | 1 | aaa | 2018-08-13 | | 2 | bbb | 2018-08-02 | | 3 | ccc | 2018-07-06 | | 4 | ddd | 2018-07-16 | | 5 | fff | 2018-07-13 | +----+-------

好的,我有一张这样的桌子

+----+-------+------------+
| id | title |    date    |
+----+-------+------------+
|  1 | aaa   | 2018-08-13 |
|  2 | bbb   | 2018-08-02 |
|  3 | ccc   | 2018-07-06 |
|  4 | ddd   | 2018-07-16 |
|  5 | fff   | 2018-07-13 |
+----+-------+------------+
+----+-------+------------+
| id | title |    date    |
+----+-------+------------+
|  4 | ddd   | 2018-07-16 |
|  2 | bbb   | 2018-08-02 |
|  1 | aaa   | 2018-08-13 |
|  5 | fff   | 2018-07-13 |
|  3 | ccc   | 2018-07-06 |
+----+-------+------------+
我想按日期列升序排序,但只在特定日期之前,然后我想按降序排序,如下所示

+----+-------+------------+
| id | title |    date    |
+----+-------+------------+
|  1 | aaa   | 2018-08-13 |
|  2 | bbb   | 2018-08-02 |
|  3 | ccc   | 2018-07-06 |
|  4 | ddd   | 2018-07-16 |
|  5 | fff   | 2018-07-13 |
+----+-------+------------+
+----+-------+------------+
| id | title |    date    |
+----+-------+------------+
|  4 | ddd   | 2018-07-16 |
|  2 | bbb   | 2018-08-02 |
|  1 | aaa   | 2018-08-13 |
|  5 | fff   | 2018-07-13 |
|  3 | ccc   | 2018-07-06 |
+----+-------+------------+
我想我可以使用UNION,但要么我不知道如何使用它,要么它不接受每个SELECT中指定的ORDERBY子句


编辑:我可能没有很好地解释自己。在我的查询中,我需要它按日期升序排序特定日期之后的所有行>=某个日期,在这种情况下,让我们使用2018-07-15和之前的所有行进行降序排序。

尝试与子查询结合:

select * from 
(select *,ord=0 from tablename where id=2
union
select *,ord=1 from tablename where id<>2)a
order by ord asc, date desc
order by (case when date >= @date then 1 else 0 end),  -- put more recent first
         (case when date >= @date then date end) asc,  -- order the first group ascending
         date desc  -- order by second group descending

使用子查询尝试此联合:

select * from 
(select *,ord=0 from tablename where id=2
union
select *,ord=1 from tablename where id<>2)a
order by ord asc, date desc
order by (case when date >= @date then 1 else 0 end),  -- put more recent first
         (case when date >= @date then date end) asc,  -- order the first group ascending
         date desc  -- order by second group descending

确切地知道您想要使用的日期,您可以这样做:

SELECT * FROM (
    SELECT 
        concat(1,'-',@firstquery := @firstquery + 1) as rownum, table_name.* 
    FROM 
        table_name, 
        (SELECT @firstquery:=0) fq 
    WHERE 
        date_column <= '2018-08-05' 
    ORDER BY 
        date_column ASC) a
UNION ALL 
SELECT * FROM (
    SELECT 
        concat(2,'-',@secondquery := @secondquery + 1) as rownum, table_name.* 
    FROM 
        table_name, 
        (SELECT @secondquery:=0) sq 
    WHERE 
        date_column > '2018-08-05' 
    ORDER BY 
        date_column DESC) b
ORDER BY rownum ASC
它相当大,但在本例中,我将基于每个子查询模拟行数,并将其连接起来,以便以后进行排序。也就是说,你可以在某个时候倒着点


我喜欢的是,我们在rownum中根据工会之前订购的每个项目指定了订单。

确切知道您想要使用的日期,您可以这样做:

SELECT * FROM (
    SELECT 
        concat(1,'-',@firstquery := @firstquery + 1) as rownum, table_name.* 
    FROM 
        table_name, 
        (SELECT @firstquery:=0) fq 
    WHERE 
        date_column <= '2018-08-05' 
    ORDER BY 
        date_column ASC) a
UNION ALL 
SELECT * FROM (
    SELECT 
        concat(2,'-',@secondquery := @secondquery + 1) as rownum, table_name.* 
    FROM 
        table_name, 
        (SELECT @secondquery:=0) sq 
    WHERE 
        date_column > '2018-08-05' 
    ORDER BY 
        date_column DESC) b
ORDER BY rownum ASC
它相当大,但在本例中,我将基于每个子查询模拟行数,并将其连接起来,以便以后进行排序。也就是说,你可以在某个时候倒着点


我喜欢这一款的原因是,我们根据在联盟之前订购的每件商品,在rownum中指定了顺序。

@D-Shih几乎把它做好了

SELECT *
FROM yourtable
ORDER BY (CASE
  WHEN `date`>"2018-07-06" THEN 'date'
  ELSE DATE("2018-07-06")
) ASC,
`date` DESC;
你可以用工会来做,但这很快就会变得一团糟


您还可以实现CASE语句,因为至少D-Shih已经基本正确了

SELECT *
FROM yourtable
ORDER BY (CASE
  WHEN `date`>"2018-07-06" THEN 'date'
  ELSE DATE("2018-07-06")
) ASC,
`date` DESC;
你可以用工会来做,但这很快就会变得一团糟


您还可以参考D-Shih奠定的基础来实现CASE语句

SELECT id
     , title
     , date
  FROM 
     ( SELECT *
            , CASE WHEN date <'2018-07-15' THEN @i:=0 ELSE @i:=@i+1 END i
         FROM t
            , (SELECT @i:=0) vars
        ORDER  
           BY date
     ) x
 ORDER
    BY i=0, i, date DESC;

你可能并不真的需要上面显示的所有技术,但我只是在继续的过程中编造这些东西…

参考D-Shih奠定的基础

SELECT id
     , title
     , date
  FROM 
     ( SELECT *
            , CASE WHEN date <'2018-07-15' THEN @i:=0 ELSE @i:=@i+1 END i
         FROM t
            , (SELECT @i:=0) vars
        ORDER  
           BY date
     ) x
 ORDER
    BY i=0, i, date DESC;

您可能并不真的需要上面所示的所有技术,但我只是在编写这些内容…

您应该使用单个order by,而不使用子查询:

select * from 
(select *,ord=0 from tablename where id=2
union
select *,ord=1 from tablename where id<>2)a
order by ord asc, date desc
order by (case when date >= @date then 1 else 0 end),  -- put more recent first
         (case when date >= @date then date end) asc,  -- order the first group ascending
         date desc  -- order by second group descending

您应该使用单个order by而不使用子查询来执行此操作:

select * from 
(select *,ord=0 from tablename where id=2
union
select *,ord=1 from tablename where id<>2)a
order by ord asc, date desc
order by (case when date >= @date then 1 else 0 end),  -- put more recent first
         (case when date >= @date then date end) asc,  -- order the first group ascending
         date desc  -- order by second group descending

它部分地起作用,它确实将这两个日期分开,但不会对它们进行不同的排序。它部分地起作用,它确实将这两个日期分开,但不会对它们进行不同的排序。这里有多种技术。。。你可能真的只需要一个或两个@草莓你能把它作为一个答案吗,因为这一个似乎是唯一一个正常工作的。很有趣,我没想到这样的事情会如此复杂。我对这个问题不满意。。。所以我用union创建了一个类似的,但我看到了其中的一些逻辑,所以我将发布答案。不过这是一个很好的练习:这里有各种各样的技巧。。。你可能真的只需要一个或两个@草莓你能把它作为一个答案吗,因为这一个似乎是唯一一个正常工作的。很有趣,我没想到这样的事情会如此复杂。我对这个问题不满意。。。所以我用union创建了一个类似的,但我看到了其中的一些逻辑,所以我将发布答案。不过这是一个很好的练习:它没有在MySQL中生成我想要的内容,@草莓对我的问题的评论是有效的。它没有在MySQL中生成我想要的内容,@草莓对我的问题的评论是有效的。你是da best。使用两个order BY和一个子查询不必要地昂贵。你是da best。使用两个order BY和一个子查询不必要地昂贵。