我正在尝试对左连接执行搜索和排序查询,如下所示:
QUERY
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子句,order by子句运行正常。另一方面,如果我将where子句更改为
WHERE IFNULL(TABLE1.NAME, TABLE2.NAME) LIKE "%QUERY%"
然后查询工作。但它在代码中带来了一些混乱,我更喜欢在where子句中使用重命名的列名。也许我错过了一些东西,或者在where子句中使用重命名的列是不可能的?
答案 0 :(得分:0)
SQL不允许使用SELECT
子句中WHERE
中定义的列别名。这是因为WHERE
子句在SELECT
之前进行了逻辑解析。
此问题的常规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;
另外,你应该习惯只使用单引号作为字符串和日期常量,然后在这种情况下总是使用它们。