运行以下查询
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中有什么办法吗?
答案 0 :(得分:2)
可以在查询选择列表中使用别名为列提供不同的名称。您可以在GROUP BY,ORDER BY或HAVING中使用别名 条款引用该栏目。
但是,
标准SQL不允许引用列
WHERE子句中的别名。这个限制是
强加,因为WHERE子句是
评估后,列值可能还没有
已经确定。
详细信息:https://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
答案 1 :(得分:1)
澄清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;
答案 2 :(得分:0)
您不能在WHERE子句中使用别名。 如果这是一个动态生成的查询,您可以查看更改尝试给出' p.id' 'pid'的别名。这将删除结果集中的pid别名,但也会删除您获得的错误。