代码之家  ›  专栏  ›  技术社区  ›  user146997

Mysql,其中使用重命名列搜索

  •  1
  • user146997  · 技术社区  · 11 年前

    我正在尝试对左联接进行搜索和排序查询,如下所示:

    查询

    SELECT 
    IFNULL(TABLE1.NAME, TABLE2.NAME) AS NAME 
    FROM TABLE1 LEFT JOIN TABLE2 ON ...
    WHERE NAME LIKE "%QUERY%"
    ORDER BY NAME ASC;
    

    问题是服务器返回错误 Unknown column 'NAME' ,但如果我删除where子句,则逐个子句即可。另一方面,如果我将where子句更改为

    WHERE IFNULL(TABLE1.NAME, TABLE2.NAME) LIKE "%QUERY%"

    则查询工作。但这会给代码带来一些混乱,我更希望在where子句中使用重命名的列名。也许我遗漏了什么,或者在where子句中不可能使用重命名的列吗?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Gordon Linoff    11 年前

    SQL不允许使用 SELECT WHERE 条款这是因为 哪里 子句在 选择 .

    此问题的常规SQL解决方案是使用子查询:

    SELECT t.*
    FROM (SELECT IFNULL(TABLE1.NAME, TABLE2.NAME) AS NAME 
          FROM TABLE1 LEFT JOIN TABLE2 ON ...
         ) t
    WHERE NAME LIKE '%QUERY%'
    ORDER BY NAME ASC;
    

    尽管这在所有数据库上都有效,但出于两个原因,它不是MySQL的好解决方案。首先,子查询被物化,这会导致开销。第二,查询不能进入视图。相反,MySQL扩展了 HAVING 子句,因此您可以执行以下操作:

    SELECT IFNULL(TABLE1.NAME, TABLE2.NAME) AS NAME 
    FROM TABLE1 LEFT JOIN TABLE2 ON ...
    HAVING NAME LIKE '%QUERY%'
    ORDER BY NAME ASC;
    

    此外,您应该养成只对字符串和日期常量使用单引号的习惯,然后在这种情况下始终使用它们。