我正在使用这个查询(最小版本)从表中过滤一些数据
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/