MYSQL 使用 AS 列名过滤

标签 mysql

我正在使用这个查询(最小版本)从表中过滤一些数据

SELECT DISTINCT 
t.name AS tname, 
CASE WHEN (t.task_group != -1) THEN (SELECT p.keyid FROM proyects AS p, task_groups AS tg WHERE tg.keyid = t.task_group AND tg.proyect = p.keyid) ELSE -1 END AS pkeyid 
FROM tasks AS t, task_users AS tu 
WHERE (t.status = '0' OR t.status = '1' OR t.status = '3') AND (t.keyid = tu.task) AND ((tu.worker = 5));

查询完美无缺。但现在我想通过以下方式过滤一些行:

SELECT DISTINCT 
t.name AS tname, 
CASE WHEN (t.task_group != -1) THEN (SELECT p.keyid FROM proyects AS p, task_groups AS tg WHERE tg.keyid = t.task_group AND tg.proyect = p.keyid) ELSE -1 END AS pkeyid 
FROM tasks AS t, task_users AS tu 
WHERE (t.status = '0' OR t.status = '1' OR t.status = '3') AND (t.keyid = tu.task) AND ((tu.worker = 5)) AND ((pkeyid = 7) OR (pkeyid = 8) OR (pkeyid = 16))

我收到语法错误“‘where 子句’中的未知列‘pkeyid’”

我能理解为什么会这样(pkeyid 不是 from 子句中任何表中的列)。有解决这个问题的简单方法吗?还是我必须重写整个查询?

最佳答案

你不能在where子句中使用别名,如果你想在过滤中使用别名,你需要使用having子句

SELECT DISTINCT 
t.name AS tname, 
CASE WHEN (t.task_group != -1) THEN (SELECT p.keyid FROM proyects AS p, task_groups AS tg WHERE tg.keyid = t.task_group AND tg.proyect = p.keyid) ELSE -1 END AS pkeyid 
FROM tasks AS t, task_users AS tu 
WHERE 
(t.status = '0' OR t.status = '1' OR t.status = '3') 
AND t.keyid = tu.task 
AND tu.worker = 5
having
pkeyid = 7 or pkeyid = 8 or pkeyid = 16

关于MYSQL 使用 AS 列名过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31609241/

相关文章:

MySQL 复合聚合和不正确的语法?

mysql - 如何在连接另一个表时搜索表中的所有列?

php - SQL中如何将数据从一行复制到另一行

php - 为什么我的数据库仍然显示 2147483647 错误?

php - ExtJS 网格存储 - 通过 CodeIgniter 将信息写入 "Save"/"Update"上的 MySQL

sql - 数据库:流水线函数

mysql - Hibernate Envers 性能 MySQL

php - 基于名称的下一个和上一个 MySQL 行

php - 将 pdf 从 blob 嵌入到 html/php 页面

mysql - 表锁可以扩展吗?/行锁对于嵌套集会更有效吗?