【问题标题】:using order by with union in inner select queries在内部选择查询中使用 order by 和 union
【发布时间】:2012-07-26 19:12:46
【问题描述】:

我想在带有联合运算符的内部选择查询中使用 order by 子句,即

select colname from table where <cond1> order by colname 
union
select colname from table where <cond2> order by colname 

我可以将 order by 用于完整结果,但我希望将第一个查询的结果排序,然后将第二个查询的结果排序。

请给我一些建议。

【问题讨论】:

  • 您必须取消第一个查询的订单

标签: mysql sql


【解决方案1】:

Order byunioned表中的正确用法是

select colname from table where <cond1> 
union
select colname from table where <cond2> order by colname

上面代码的解释是,在两个查询合并后,然后根据列名排序。它在服务器将较低的查询与第一个查询联合之前先对它进行排序。但是还有一种替代方法,您需要将其包装在子查询中。

SELECT newTable.colname
FROM
(
    select colname, 1 as OrderThis from table where <cond1> 
    union
    select colname, 2 as OrderThis from table where <cond2> 
) newTable
Order by newTable.OrderThis, newTable.colname

如果我的想法正确,您希望在union 两个查询正确并保持其正确位置之前先对列进行排序(第一个查询结果保持在顶部,而第二个查询结果保持在第一个下方查询)

【讨论】:

  • 这导致了另一个问题,因为有一些记录同时满足条件 1 和条件 2,所以这导致这些记录的重复,因为它们现在不是唯一的,因为 OrderThis 使它们成为不同的记录。可以请您提出解决方案。
【解决方案2】:

以下应该做......我猜

select colname,1 as OrderCol from table where <cond1> 
union select colname,2 as OrderCol  from table 
where <cond2>  
order by OrderCol

【讨论】:

  • 这导致了另一个问题,因为有一些记录同时满足条件 1 和条件 2,所以这导致这些记录的重复,因为它们现在不是唯一的,因为 OrderCol 已经使它们成为不同的记录。可以请您提出解决方案。
  • 如果您从同一个表中选择数据,我不明白您为什么要使用联合。您不能编写简单的 select stmt 并将两个条件都放在 OR 中。并在 select stmt 中使用 distinct 来忽略重复条目。
  • 我必须使用联合,因为我需要优先考虑来自第一个条件而不是第二个条件的结果。
  • 您不需要为此使用 Union。您可以使用 case 语句,即 - select col1,col2, case when then 1 when then 2 end ordCol from tbl1 where or order by ordCol(如果有帮助,请点赞评论)跨度>
【解决方案3】:

这可能会解决问题

SELECT * FROM ( SELECT colname  FROM table1 where <cond1> order by colname ) DUMMY_ALIAS1

UNION ALL

SELECT * FROM ( SELECT colname  FROM table2 where <cond2> order by colname ) DUMMY_ALIAS2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多