mysql查询语法错误,在mysql8.0之后不能在UNION之前使用LIMIT吗?

时间:2018-11-05 12:06:54

标签: mysql sql

SQL:

select * from t_google_receipt limit 1 union select * from t_old_google_receipt limit 1;

在我的旧mysql(服务器版本:5.6.17-log MySQL社区服务器(GPL))中,代码中的sql成功执行,但是在更新为mysqlGroup(服务器版本:8.0.11 MySQL社区服务器-GPL)之后,它失败了,

  

错误1064(42000):您的SQL语法有错误;检查   与您的MySQL服务器版本相对应的手册   在“联合选择*从t_old_google_receipt限制1”附近使用的语法   在第1行;

3 个答案:

答案 0 :(得分:2)

它实际上在MySQL 5.7中发生了变化:

  

要将ORDER BY或LIMIT应用于单个SELECT,请放置子句   括在SELECT中的括号内:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
     

注意

     

以前的MySQL版本可能允许这样的语句,而无需   括号。在MySQL 5.7中,括号的要求是   强制执行。

无论如何,请注意,如果不提供单独的ORDER BY子句,则会得到任意行(甚至不是随机行)。

答案 1 :(得分:1)

使用括号:

(select * from t_google_receipt limit 1)
union
(select * from t_old_google_receipt limit 1);

注意:

  • 您可能想要union all而不是union
  • 在没有limit的情况下使用order by是可疑的。
  • 这假定两个表中的列相同,以相同的顺序定义,并且具有兼容的类型。

答案 2 :(得分:0)

对于工会和工会,您必须考虑以下几点

  1. UNION中的每个SELECT语句必须具有相同数量的 列
  2. 这些列还必须具有相似的数据类型

  3. 每个SELECT语句中的列也必须顺序相同

因此,在有两个表联合的情况下,使用表中的全选(select *)列是一种不好的做法,而像下面这样显式地使用列名是更可取的,并且错误更少。

 select col1,col2... coln from t1
 union 
 select col1,col2.....coln from t2