Mysql 运行时常见错误解决方法 Sucha

Administrator
发布于 2020-07-22 / 1890 阅读 / 0 评论 / 0 点赞

Mysql 运行时常见错误解决方法 Sucha

Mysql 运行时常见错误解决方法

1、order by和group by先后顺序导致的报错

SELECT
	t.id,
	t.bed_no AS bedNo 
FROM
	tb_org_patient t 
WHERE
	t.is_deleted = 0 
	AND t.is_enable = 1 
	AND t.org_id = 111 
	AND t.is_out_hp = 0 
	AND t.district_id = 539
	AND t.bed_no IS NOT NULL 
    AND t.bed_no != '' 
 ORDER BY
	 t.bed_no ASC
 GROUP BY
  	 t.bed_no
  • 以上代码执行会报如下错误
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY
t.bed_no' at line 16
  • 解决方法

将order放在最后即可

SELECT
	t.id,
	t.bed_no AS bedNo 
FROM
	tb_org_patient t 
WHERE
	t.is_deleted = 0 
	AND t.is_enable = 1 
	AND t.org_id = 111 
	AND t.is_out_hp = 0 
	AND t.district_id = 539
	AND t.bed_no IS NOT NULL 
    AND t.bed_no != '' 
 GROUP BY
  	 t.bed_no
 ORDER BY
	 t.bed_no ASC

2、MySQL中union和order by同时使用的实现方法。报错:Incorrect usage of UNION and ORDER BY

MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明。首先看下面的t1表。

img

1、如果直接用如下sql语句是会报错:Incorrect usage of UNION and ORDER BY。


SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC
UNION
SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC

因为union在没有括号的情况下只能使用一个order by,所以报错,这个语句有2种修改方法。如下:

(1)可以将前面一个order by去掉,改成如下:


SELECT * FROM t1 WHERE username LIKE 'l%'
UNION
SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC

该sql的意思就是先union,然后对整个结果集进行order by。如此一来第一条select语句就无法order by 排序

(2)可以通过两个查询分别加括号的方式,改成如下:

(SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY sroce ASC)
UNION
(SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC)

这种方式的目的是为了让两个结果集先分别order by,然后再对两个结果集进行union。如果order by 无效,可改成如下格式:

SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC) t3
UNION 
SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC) t4

也就是说,order by不能直接出现在union的子句中,但是可以出现在子句的子句中。

2、union 和 union all 的区别

union会过滤掉两个结果集中重复的行,而union all不会过滤掉重复行。

3、union 和 order by 共存的办法

SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE 'l%' ) t3
UNION 
SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE '%m%' ) t4 ORDER BY score ASC

将 ORDER BY 放置在 union 之后

3、Mysql中使用replace uuid()后主键没有重复却报Duplicate entry '' for key 'PRIMARY'错

  • 解决mysql replace uuid() 导致重复的问题
#当字符集设置为utf8mb4时,执行下面SQL时,返回的多条数据中的uuid是相同的值。

SELECT UPPER(REPLACE(uuid(),'-','')) FROM  t_user

----------------------------------------------------------------------------------
UPPER(REPLACE(uuid(),'-',''))
52A8B75CEB5D11E5B180005056920044
52A8B75CEB5D11E5B180005056920044
52A8B75CEB5D11E5B180005056920044
52A8B75CEB5D11E5B180005056920044

----------------------------------------------------------------------------------

#解决办法可以是这样,加MD5:
SELECT MD5(uuid()) FROM  t_user

4、Mysql中错误码: 1630 FUNCTION count does not exist. Check the 'Function Name Parsing and Resolution' section in

 错误码: 1630

FUNCTION count does not exist. Check the'Function Name Parsing and Resolution' section in the Reference Manual

#解决方案:如sum() count() avg这些函数里面是这样子写的sum () sum和()分开了,不是挨着写的,所以报这个错

评论