MySQL中Union子句不支持order by的解决方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中Union子句不支持order by的解决方法相关的知识,希望对你有一定的参考价值。

参考技术A 本文实例讲述了mysql中Union子句不支持order
by的解决方法。分享给大家供大家参考,具体如下:
我对DB知之甚少,这问题只在MySQL遇到,不知道别的DBMS是不是也如此。
问题是这样的,我打算在一个表里获得与某一行记录相邻的两行,并且想通过union一起取出来,所以这么写:
select
id,title
from
subjects
where
id>#some_id#
order
by
id
limit
1
union
select
id,title
from
subjects
where
id<#some_id#
order
by
id
limit
1
但出现了错误提示“Incorrect
usage
of
UNION
and
ORDER
BY”。看来不能这么用union和order
by,但这里确实是需要order
by的。很快,我想到了一个变通的写法:
select
*
from
(
select
id,title
from
subjects
where
id>#some_id#
order
by
id
limit
1
)
union
select
id,title
from
subjects
where
id<#some_id#
order
by
id
limit
1
从经验上说,第二个子句该不会被union影响,可以用order
by。于是把第一个子句包在一个括号里,这下应该就可以了。可是还是有错误,提示“
Every
derived
table
must
have
its
own
alias”。这里的提示是需要给我们括号里面生成的临时表取一个别名,这个好办多了。于是改为:
select
*
from
(
select
id,title
from
subjects
where
id>#some_id#
order
by
id
limit
1
)
as
t1
union
select
id,title
from
subjects
where
id<#some_id#
order
by
id
limit
1
这条语句成功执行并且得到了正确的结果,在此写下来备忘。
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》
希望本文所述对大家MySQL数据库计有所帮助。

强制 MySQL 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?

【中文标题】强制 MySQL 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?【英文标题】:Force MySQL to return duplicates from WHERE IN clause without using JOIN/UNION? 【发布时间】:2011-01-16 13:55:24 【问题描述】:

这可能不是很明智,但是如果WHERE IN 子句中有重复的条件,我想让 MySQL 返回确切的重复行。这可能吗?

举个例子:

SELECT
   columns
FROM
   table
WHERE
   id IN( 1, 2, 3, 4, 5, 1, 2, 5, 5)

我希望 MySQL 向我返回 id 为 5 的行 3 次,id 为 1 和 2 的行两次,以及 3 和 4 的一次。

由于IN 参数的长度以及重复计数(一次、两次、三次等)是任意的,我不想依赖UNIONJOIN。否则这样的事情可能吗?

【问题讨论】:

【参考方案1】:

我不确定您为什么要禁止 JOIN,因为它对 SQL 来说相当重要。这就像禁止函数式语言中的函数调用。

解决这个问题的一个好方法是创建一个结果集,其中包含您想要返回的 ID 并加入其中。这是一种方法:

SELECT Table1.*
FROM Table1
JOIN (SELECT 1 AS id
      UNION ALL SELECT 2
      UNION ALL SELECT 3
      UNION ALL SELECT 4
      UNION ALL SELECT 5
      UNION ALL SELECT 1
      UNION ALL SELECT 2
      UNION ALL SELECT 5
      UNION ALL SELECT 5) AS T1
ON Table1.id = T1.id

我不确定您是否考虑过这种方法?它没有您似乎害怕的问题。

如果你禁止加入,除非你使用存储过程,否则你不能这样做,我会说这比加入更糟糕。

【讨论】:

嗨,马克,感谢您的回答。从表面上看,我想我只需要使用 JOIN 和 UNION 即可。我不知道您在这里使用 UNION 的方式。我什至不确定我是否完全理解它。 :) 但它看起来非常漂亮!起初我不想使用 UNION 的原因是因为我认为我必须一遍又一遍地重复确切的 SELECT 语句。不过这看起来干净多了。 顺便问一下,这些 UNION 会保证结果的确切顺序,还是我仍然需要使用 ORDER 子句来完全按照语句中的顺序对它们进行排序? 如果您想保证订单,您需要订单。这总是正确的。幸运的是,很容易更改上面的查询:SELECT 1 as ID, 1 as SortOrder UNION ALL SELECT 2, 2 UNION ALL SELECT 3, 3 等...然后在JOIN ... ON ... 之后的末尾ORDER BY SortOrder 谢谢马克。我会接受这是最好的答案。你向我展示了一些新的技巧。不错!

以上是关于MySQL中Union子句不支持order by的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥在mysql中第一个union两个子句的order by不起作用

我可以在 SQL 中使用 UNION 子句的查询中添加 ORDER BY 子句吗?

在 sql 查询中使用 group/order by 和 union 子句

带有 UNION 子句的 ORDER BY

UNION ALL、UNION与ORDER BY

有没有类似 ORDER BY 的子句? [关闭]