2013-12-12 3 views
3

У меня проблема с моим запросом, что случилось?MySQL Case Statement - Неизвестный столбец где

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' в 'где предложение'

Спасибо!

+0

Где оленья кожа видеть псевдонимы. – Mihai

ответ

4

Это потому, что SELECT готовят результат (как id_ranking) ПОСЛЕ того, как 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. ЕКОМ
  2. ИНЕКЕ
  3. GROUP BY п
  4. предложения HAVING
  5. ЗЕЬЕСТ
  6. ORDER BY статья
+0

У вас нет другого способа решить проблему? Элемент «id_ranking (1,2)» является переменным –

+0

Это хороший стандартный метод, но вы можете получить один результат со многими другими методами. Например, вы можете огласить предложение CASE в WHERE, или выбрать другую таблицу, а затем использовать свое текущее предложение (2 запроса). Но вам это действительно нужно? – BaBL86

+0

Спасибо! Я разрешаю использовать случай, где –

0

Вы не можете использовать псевдоним в предложении где, вместо того, чтобы попытаться

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, fixing – a1ex07

Смежные вопросы