Order by 无法与 Union ALL my sql 一起正常工作
Order by is not working correctly with Union ALL my sql
我有查询要在其中列出结果,如下所示:
我已经使用下面的查询来实现它,但它没有按预期工作,并且对结果进行了 ASC 或 DESC 排序。
SELECT * from (SELECT eventid, eventdate,eventdates FROM events WHERE events.onlineclosingdate>curdate() order by onlineclosingdate asc) a
UNION ALL
SELECT * from (SELECT eventid, eventdate,eventdates FROM events WHERE events.onlineclosingdate<=curdate() order by onlineclosingdate desc) as c
合并两个查询并在 一个
中分组
SELECT * FROM (
SELECT a.eventid as `eventid`, a.eventdate as `eventdate`, a.eventdates as `eventdates` FROM events a WHERE a.onlineclosingdate>curdate() order by a.onlineclosingdate asc)
UNION ALL
SELECT c.eventid as `eventid`, c.eventdate as `eventdate`, c.eventdates as `eventdates` FROM events c WHERE c.onlineclosingdate<=curdate() order by c.onlineclosingdate desc)
) as `all`
也许您需要确定 2 个日期段块并使用条件顺序,例如
鉴于
drop table if exists t;
create table t (id int auto_increment primary key, dt date);
insert into t (dt) values
('2017-02-01'),('2017-10-01'),('2017-01-01'),
('2016-02-01'),('2016-10-01'),('2016-01-01');
select s.id,s.dt
from
(
select 1 as srce,id,t.dt dt from t where dt > str_to_date('2016-12-31','%Y-%m-%d')
union all
select 2,id,t.dt from t where dt <= str_to_date('2016-12-31','%Y-%m-%d')
) s
order by srce asc,
case when s.srce = 1 then s.dt end asc,
case when s.srce = 2 then s.dt end desc;
+----+------------+
| id | dt |
+----+------------+
| 3 | 2017-01-01 |
| 1 | 2017-02-01 |
| 2 | 2017-10-01 |
| 5 | 2016-10-01 |
| 4 | 2016-02-01 |
| 6 | 2016-01-01 |
+----+------------+
6 rows in set (0.00 sec)
我有查询要在其中列出结果,如下所示:
我已经使用下面的查询来实现它,但它没有按预期工作,并且对结果进行了 ASC 或 DESC 排序。
SELECT * from (SELECT eventid, eventdate,eventdates FROM events WHERE events.onlineclosingdate>curdate() order by onlineclosingdate asc) a
UNION ALL
SELECT * from (SELECT eventid, eventdate,eventdates FROM events WHERE events.onlineclosingdate<=curdate() order by onlineclosingdate desc) as c
合并两个查询并在 一个
中分组SELECT * FROM (
SELECT a.eventid as `eventid`, a.eventdate as `eventdate`, a.eventdates as `eventdates` FROM events a WHERE a.onlineclosingdate>curdate() order by a.onlineclosingdate asc)
UNION ALL
SELECT c.eventid as `eventid`, c.eventdate as `eventdate`, c.eventdates as `eventdates` FROM events c WHERE c.onlineclosingdate<=curdate() order by c.onlineclosingdate desc)
) as `all`
也许您需要确定 2 个日期段块并使用条件顺序,例如 鉴于
drop table if exists t;
create table t (id int auto_increment primary key, dt date);
insert into t (dt) values
('2017-02-01'),('2017-10-01'),('2017-01-01'),
('2016-02-01'),('2016-10-01'),('2016-01-01');
select s.id,s.dt
from
(
select 1 as srce,id,t.dt dt from t where dt > str_to_date('2016-12-31','%Y-%m-%d')
union all
select 2,id,t.dt from t where dt <= str_to_date('2016-12-31','%Y-%m-%d')
) s
order by srce asc,
case when s.srce = 1 then s.dt end asc,
case when s.srce = 2 then s.dt end desc;
+----+------------+
| id | dt |
+----+------------+
| 3 | 2017-01-01 |
| 1 | 2017-02-01 |
| 2 | 2017-10-01 |
| 5 | 2016-10-01 |
| 4 | 2016-02-01 |
| 6 | 2016-01-01 |
+----+------------+
6 rows in set (0.00 sec)