第一个语句中的MYSQL联合顺序

时间:2016-08-10 07:10:06

标签: mysql sql union

我有这个问题:

(SELECT * FROM items WHERE duration = 5 ORDER BY date DESC) 
UNION 
(SELECT * FROM items WHERE duration = 10) 

问题是" ORDER BY"在第一个查询中不起作用。

5 个答案:

答案 0 :(得分:0)

试试这个:

 select * from (
    SELECT * FROM items WHERE duration = 5
    UNION 
    SELECT * FROM items WHERE duration = 10
    ) odrer by date DESC

答案 1 :(得分:0)

当您在每个select语句中不允许使用 UNION UNION ALL 时。您必须在外部选择语句中应用 order by。

答案 2 :(得分:0)

首先按持续时间排序UNION结果,然后按日期排序。

select *
from
(
    SELECT * FROM items WHERE duration = 5
    UNION 
    SELECT * FROM items WHERE duration = 10
)
order by duration, date DESC

但是,不需要UNION(请参阅e4c5&#39}。

答案 3 :(得分:0)

如果我从评论中了解你,你想要这样的东西吗?

SELECT s.* FROM (
    SELECT i.*,1 as ord_col FROM items i WHERE duration = 5 
    UNION 
    SELECT it.*,2 FROM items it WHERE duration = 10) s
ORDER BY CASE WHEN s.ord_col = 5 THEN s.date 
                                 ELSE '1000-01-01'
         END DESC

虽然这个查询效率很低,但你可以选择一个:

SELECT i.* FROM items i WHERE i.duration IN(5,10)
ORDER BY CASE WHEN s.ord_col = 5 THEN s.date 
                                 ELSE '1000-01-01'
         END DESC

如果它不是动态的,5将在10之前订购并且这些是常量值,您只需将duration列添加到查询ORDER BY duration,date即可这也将命令第二个查询为日期,就在第一个查询之后。

答案 4 :(得分:0)

我认为你甚至根本不需要UNION,你可以这样重构你的查询:

  select *  
    from v$sql v Where v.PARSING_SCHEMA_NAME = '<schemaname>'
     And module like 'TOAD%' and SUBSTR (V.LAST_LOAD_TIME, 1, 10) = '2016-08-10' 
   Order by V.LAST_LOAD_TIME desc

此查询将根据您的持续时间排序(具有5的那些将首先出现,10秒),然后作为二阶选项,它将按日期降序排列持续时间= 5的持续时间。

当然,这可能更优雅,但符合OP A / C并完成工作。