【问题标题】:UNION SELECT CONCAT works differently between MariaDB / MySQLUNION SELECT CONCAT 在 MariaDB / MySQL 之间的工作方式不同
【发布时间】:2019-11-11 10:45:08
【问题描述】:

我最近将一个应用程序从 MySQL 5.5 迁移到 MariaDB 10.3。 该应用程序的一部分是一个活动日历,用户可以在其中添加自己的活动,其中包含地址、城镇等详细信息。

我注意到运行该软件的其中一个查询不再适用于 MariaDB,尽管语法应该仍然没问题。

我尝试回到 MySQL 5.5 并且查询再次运行。 我还在 MariaDB 10.3 上的 phpMyadmin 中运行了查询,它显示了相同的结果,但以错误结束:

ERROR 1064:您的 SQL 语法有错误;检查手册 在 'UNION SELECT CONCAT(title_clang_1,' - ',street,' ',zip,' ',district,' ', town,' 在第 1 行

这是查询:

SELECT
  'choose' label,
  '' id
FROM
  table_events
LIMIT
  1
UNION
SELECT
  CONCAT(
    title_clang_1,
    ' - ',
    street,
    ' ',
    zip,
    ' ',
    district,
    ' ',
    town,
    ' ',
    additional
  ) label,
  id
FROM
  table_events
WHERE
  offline IS NULL || offline = '|0|'

“table_events”表包含此处列出的所有列:id、title_clang_1、street、zip、district、town、additional - 以及与此查询无关的更多列。

我希望输出所有离线字段填充为零或 NULL 的事件,但我收到了语法错误。

【问题讨论】:

  • ' 离线为 NULL || offline = '|0|'' 我不相信这是 mysql 或 mariadb 语法,它应该做什么?
  • @P.Salmon ||(替代OR)被 MySQL 和 MariaDB 接受:mariadb.com/kb/en/library/ordev.mysql.com/doc/refman/8.0/en/…
  • @Madhur Bhaiya 谢谢我没有意识到这一点,仍然认为或不是;对 || 的开销并不大。
  • 我在 mariadb 服务器版本中遇到的错误:10.1.14-MariaDB 是 ERROR 1221 (HY000):UNION 和 LIMIT 的使用不正确
  • 更不用说在没有ORDER BY 的情况下使用LIMIT 1 来选择“第一条”记录是毫无意义,正如ANSI/ISO SQL 标准表/结果集所定义的那样,orderless .. 该查询的结果将是非确定性(随机)以获得纯 100% 确定性(固定)的,您至少必须在 ORDER BY 子句中添加一个主要或唯一的列键。

标签: mysql database mariadb concat


【解决方案1】:

我很确定你的这个查询在 MySQL 中也不起作用(至少在较新的版本中)。 MySQL Documentation明确表示:

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

您需要在各个 SELECT 查询块周围使用括号,因为您在第一个查询中使用 LIMIT

(
SELECT
  'choose' label,
  '' id
FROM
  table_events
LIMIT
  1
)
UNION
(
SELECT
  CONCAT(
    title_clang_1,
    ' - ',
    street,
    ' ',
    zip,
    ' ',
    district,
    ' ',
    town,
    ' ',
    additional
  ) label,
  id
FROM
  table_events
WHERE
  offline IS NULL || offline = '|0|'
)

【讨论】:

  • 更不用说在没有ORDER BY 的情况下使用LIMIT 1 来选择“第一条”记录是无意义,正如ANSI/ISO SQL 标准表/结果集所定义的那样,orderless .. 该查询的结果将是非确定性(随机)以获得纯 100% 确定性(固定)的,您至少必须在 ORDER BY 子句中添加一个主要或唯一的列键。
  • @RaymondNijland 你是绝对正确的。尽管 OP 滥用(不必要地)SELECT 查询来生成常量文本作为列标题(对于他的表,我猜!)。看来UNION 在他的用例中绝对不需要。他可以简单地在应用程序代码中生成这些列标题。
  • “他可以简单地在应用程序代码中生成这些列标题。” 同意,但 ( SELECT 'choose' label, '' id FROM table_events LIMIT 1 ) 应该/本来可以简单地为 ( SELECT 'choose' label, '' id FROM DUAL ) 然后
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2018-09-04
  • 2011-07-03
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多