运行以下查询
SELECT p.id as pid,p.name as pname, p.email,p.phone,p.created as pcreated,
p.updated as pupdated, GROUP_CONCAT(g.name) AS groups FROM ft_smsender_persons p
JOIN ft_smsender_persons2groups AS p2g ON p.id = p2g.person_id JOIN ft_smsender_groups AS g ON g.id = p2g.group_id
WHERE 1=1 AND deleted = 0 AND p.id as pid LIKE '%7%' OR pname LIKE '%7%' OR
email LIKE '%7%' OR phone LIKE '%7%' OR pcreated LIKE '%7%'
OR pupdated LIKE '%7%' OR groups LIKE '%7%' group by pname, email ORDER BY pid asc给我一个关于p.id as pid LIKE '%7%'的错误
如果我像使用pid like %7%一样使用它,它会给我一个错误,说pid是未知列
查询是动态生成的,所以我通过代码修复它的范围很小;在mysql中有什么方法吗?
发布于 2015-08-13 02:44:55
可以在查询选择列表中使用别名来为列指定不同的名称。您可以在GROUP BY、ORDER BY或HAVING子句中使用别名来引用列。
但,
标准SQL不允许引用列
WHERE子句中的别名。之所以施加此限制,是因为在计算WHERE子句时,可能尚未确定列值。
详情:https://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
发布于 2015-08-13 04:25:15
为了澄清Being Sunny说的..。不应对查询的where子句部分中的列使用别名,除非该列在聚合函数中被引用。在选择列之前,该查询使用where子句来确定如何使用联接条件缩小已联接表中的行的范围。因此,在非聚合函数的where子句中引用别名列名将导致Error 1054: unknown column name。
尝试在where子句中从查询中删除这些别名:
SELECT p.id as pid, p.name as pname, p.email, p.phone, p.created as pcreated,
p.updated as pupdated, GROUP_CONCAT(g.`name`) AS groups FROM ft_smsender_persons p
JOIN ft_smsender_persons2groups AS p2g ON p.id = p2g.person_id JOIN ft_smsender_groups AS g ON g.id = p2g.group_id
WHERE 1=1 AND deleted = 0 AND p.id LIKE '%7%' OR p.`name` LIKE '%7%' OR
p.email LIKE '%7%' OR p.phone LIKE '%7%' OR p.created LIKE '%7%'
OR p.updated LIKE '%7%' OR `groups` LIKE '%7%' group by pname, email ORDER BY pid asc;发布于 2015-08-13 04:14:28
WHERE子句中不能有别名。如果这是一个动态生成的查询,您可以考虑更改试图为'p.id‘提供别名'pid’的参数。这将删除结果集中的pid别名,但也会删除您得到的错误。
https://stackoverflow.com/questions/31972692
复制相似问题