WHERE子句中的SELECT语句之一

时间:2014-11-15 19:04:52

标签: mysql sql

SELECT 
    p.ID, r.ID, z.ID, 
    CONCATE_WS(' ', z.name, z.surename) AS fullname 
FROM 
    table p 
JOIN 
    table2 r 
JOIN 
    table3 z 
WHERE 
    fullname COLLAT UTF8_GENERAL_CI LIKE %John Newman% 
ORDER BY 
    p.start_date

错误:

  

专栏'全名'在WHERE子句中找不到

4 个答案:

答案 0 :(得分:1)

您不能在where子句中使用 fullname 别名,而应使用

在你的where子句中

CONCATE_WS(' ', z.name, z.surename)

您只能在GROUP BY,ORDER BY或HAVING子句中使用列别名。

标准SQL不允许您引用WHERE子句中的列别名。强制执行此限制是因为执行WHERE代码时,可能尚未确定列值。

答案 1 :(得分:1)

MySQL有一个方便的扩展,您可以在此上下文中使用having,而不是where

SELECT p.ID, r.ID, z.ID, CONCATE_WS(' ', z.name, z.surename) AS fullname 
FROM table p JOIN
     table2 r JOIN 
      able3 z 
HAVING fullname COLLAT UTF8_GENERAL_CI LIKE %John Newman% 
ORDER BY p.start_date;

我认为你错过了on条款。如果您不打算on条款,那么您应该明确并使用cross join代替join

答案 2 :(得分:0)

问题是你在where子句中遇到allias。 select语句被SQL评估为最后一个,所以它并不知道你的全名'并且给你一个永远不会进入选择部分的错误,因此它永远不会发现你的全名是什么意思。

答案 3 :(得分:0)

fullname是别名,而在where子句中,您应该使用列名或用于连接它们的相同函数CONCAT_WS(' ', z.name, z.surename)

试试这个:

SELECT p.ID,r.ID,z.ID, CONCAT_WS(' ', z.name, z.surename) AS fullname 
FROM table p JOIN table2 r JOIN table3 z 
WHERE 
CONCAT_WS(' ', z.name, z.surename) COLLATE UTF8_GENERAL_CI LIKE '%John Newman%' 
ORDER BY p.start_date