2013-12-12 46 views
3

我的查询有问题,有什么问题?MySQL病例声明 - 未知列在哪里

SELECT 
    CASE 
     WHEN cp_pessoa.score < 100 THEN 1 
     WHEN cp_pessoa.score < 300 THEN 2 
     WHEN cp_pessoa.score >= 300 THEN 3 
    END as id_ranking 
FROM cp_pessoa 
    WHERE id_ranking IN (1,2); 

我得到这个错误:#1054 - 在未知列'id_ranking 'where子句'

谢谢!

+0

哪里犯规看到别名。 – Mihai

回答

4

这是因为SELECT准备结果(作为id_ranking)AFTER比WHERE被调用。

SELECT 
    CASE 
    WHEN cp_pessoa.score < 100 THEN 1 
    WHEN cp_pessoa.score < 300 THEN 2 
    WHEN cp_pessoa.score >= 300 THEN 3 
END as id_ranking 
FROM cp_pessoa 
WHERE cp_pessoa.score < 300; 

这是如何工作的(按顺序):

  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY条款
+0

还没有其他方法可以解决? “id_ranking(1,2)”这部分是变量 –

+0

这是一个很好的标准方法,但您可以使用其他方法得到一个结果。例如,您可以在WHERE子句中公开CASE,或者选择到另一个表中,而不是使用当前子句(2个查询)。但你真的需要这个吗? – BaBL86

+0

谢谢!我决定在哪里使用 –

0

你不能在where子句中使用别名,而不是尝试

SELECT 
CASE 
    WHEN cp_pessoa.score < 100 THEN 1 
    WHEN cp_pessoa.score < 300 THEN 2 
    WHEN cp_pessoa.score >= 300 THEN 3 
END as id_ranking 
FROM cp_pessoa 
WHERE cp_pessoa.score < 300 
3

,别名不会在where不允许的。更改查询要么

SELECT * FROM 
(
SELECT 
    CASE 
     WHEN cp_pessoa.score < 100 THEN 1 
     WHEN cp_pessoa.score < 300 THEN 2 
     WHEN cp_pessoa.score >= 300 THEN 3 
    END as id_ranking 
FROM cp_pessoa 
)a 
WHERE id_ranking IN (1,2) 

SELECT 
    CASE 
     WHEN cp_pessoa.score < 100 THEN 1 
     WHEN cp_pessoa.score < 300 THEN 2 
     WHEN cp_pessoa.score >= 300 THEN 3 
    END as id_ranking 
FROM cp_pessoa 
WHERE 
    CASE 
     WHEN cp_pessoa.score < 100 THEN 1 
     WHEN cp_pessoa.score < 300 THEN 2 
     WHEN cp_pessoa.score >= 300 THEN 3 
    END IN (1,2) 
+0

YOR WHERE工作无处不在,因为1,2和3始终<300 – BaBL86

+0

@ BaBL86:true,正在修复 – a1ex07