2015-12-24 4 views
4

У меня есть сложный запрос, который выполняет несколько совпадений по нескольким столбцам, а затем заказы по релевантности.MySQL CASE WHEN where where вызывает отказ

Все работает отлично, пока я не добавить WHERE 'rank' > 0

Это возвращает пустой набор результатов.

Если я удаляю инструкцию «WHERE», тогда я вижу все результаты с наивысшими совпадениями в верхней части.

Может ли кто-нибудь помочь мне разобраться «ГДЕ» :-D Я ошибаюсь!

SELECT *, CASE WHEN companyName = 'gfdgfs' THEN 2 ELSE 0 END 
+ CASE WHEN companyName LIKE '%gfdgfs%' THEN 1 ELSE 0 END 
+ CASE WHEN companyName = 'potato' THEN 2 ELSE 0 END 
+ CASE WHEN companyName LIKE '%potato%' THEN 1 ELSE 0 END 
+ CASE WHEN address1 = 'gfdgfs' THEN 2 ELSE 0 END 
+ CASE WHEN address1 LIKE '%gfdgfs%' THEN 1 ELSE 0 END 
+ CASE WHEN address1 = 'potato' THEN 2 ELSE 0 END 
+ CASE WHEN address1 LIKE '%potato%' THEN 1 ELSE 0 END 
AS rank 
FROM clients 
WHERE rank > 0 
ORDER BY rank 

EDIT

я удалил одинарные кавычки rank слова и теперь получить «неизвестный ранг столбца в котором пункт»

+2

Удалить одиночные кавычки из 'Rank' в обоих местах и ​​попытаться – MusicLovingIndianGirl

+0

Неизвестный ранг столбца в выражении WHERE, если Я делаю это так, по крайней мере, это что-то - я маскировал проблему, но как мне это исправить? :-P –

+1

Я не думаю, что MySQL будет поддерживать предложение WHERE' с 'aliases' - проверьте http://stackoverflow.com/questions/200200/can-you-use-an-alias-in-the-where- clause-in-mysql – MusicLovingIndianGirl

ответ

1

Удалить одиночные кавычки из rank и попробовать. Во всяком случае, я не думаю, что MySQL будет поддерживать предложение WHERE с псевдонимами - отметьте this.

Использование HAVING вместо WHERE:

SELECT *, CASE WHEN companyName = 'gfdgfs' THEN 2 ELSE 0 END + CASE WHEN companyName LIKE '%gfdgfs%' THEN 1 ELSE 0 END + CASE WHEN companyName = 'potato' THEN 2 ELSE 0 END + CASE WHEN companyName LIKE '%potato%' THEN 1 ELSE 0 END + CASE WHEN address1 = 'gfdgfs' THEN 2 ELSE 0 END + CASE WHEN address1 LIKE '%gfdgfs%' THEN 1 ELSE 0 END + CASE WHEN address1 = 'potato' THEN 2 ELSE 0 END + CASE WHEN address1 LIKE '%potato%' THEN 1 ELSE 0 END AS rank FROM clients HAVING rank > 0 ORDER BY rank

0

Попробуйте это:

SELECT * 
FROM (SELECT *, CASE WHEN companyName = 'gfdgfs' THEN 2 ELSE 0 END 
       + CASE WHEN companyName LIKE '%gfdgfs%' THEN 1 ELSE 0 END 
       + CASE WHEN companyName = 'potato' THEN 2 ELSE 0 END 
       + CASE WHEN companyName LIKE '%potato%' THEN 1 ELSE 0 END 
       + CASE WHEN address1 = 'gfdgfs' THEN 2 ELSE 0 END 
       + CASE WHEN address1 LIKE '%gfdgfs%' THEN 1 ELSE 0 END 
       + CASE WHEN address1 = 'potato' THEN 2 ELSE 0 END 
       + CASE WHEN address1 LIKE '%potato%' THEN 1 ELSE 0 END 
       AS rank 
     FROM clients 
    ) AS A 
WHERE rank > 0 
ORDER BY rank; 
+0

no does not work - musiclovingindiangirl получил это правильно, что 'WHERE' не работает с псевдонимом. Вместо этого нужно использовать 'HAVING'. Спасибо хоть. –