首页 > 解决方案 > UNION SELECT CONCAT 在 MariaDB / MySQL 之间的工作方式不同

问题描述

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

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

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

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

这是查询:

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、region、town、additional - 以及与此查询无关的更多列。

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

标签: mysqldatabasemariadbconcat

解决方案


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

要将 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|'
)

推荐阅读