2016-11-29 4 views
0

У меня есть этот запрос, который проверяет каждое ключевое слово, введенное из текстового поля поиска, и должно возвращаться с помощью наиболее подходящих ключевых слов. Я сделал запрос и его работу отлично. Проблема в том, что я хотел бы исключить все KW_MATCHED с 0 значениями в возвращаемой строке.MySql Повторное использование псевдонима для предложения WHERE

SELECT 
    A1.*, (
     SELECT 
      sum(
       CASE 
       WHEN (A1.ID = A2.tag_id) 
       AND (
        A2.keyword = 'keyword1' || A2.keyword = 'keyword2' 
       ) THEN 
        1 
       ELSE 
        0 
       END 
      ) 
     FROM 
      tbl_article_tags A2 
    ) AS KW_MATCHED 
FROM 
    tbl_article A1 
ORDER BY 
    KW_MATCHED DESC 

Результат:

+----+---------------+----------------+------------+ 
| ID | Title   | Content  | KW_MATCHED | 
+----+---------------+----------------+------------+ 
| 1 | title   | Lorem Ipsum... | 7   | 
+----+---------------+----------------+------------+ 
| 2 | another title | Lorem Ipsum... | 5   | 
+----+---------------+----------------+------------+ 
| 3 | another title | Lorem Ipsum... | 0   | 
+----+---------------+----------------+------------+ 
| 4 | another title | Lorem Ipsum... | 0   | 
+----+---------------+----------------+------------+ 

Я попытался повторным использованием псевдонима KW_MATCHED для ИНЕК (см моего запроса ниже), но он возвращает это сообщение:

[Err] 1054 - Неизвестная колонка «KW_MATCHED» в разделе «где»

SELECT 
    A1.*, (
     SELECT 
      sum(
       CASE 
       WHEN (A1.ID = A2.tag_id) 
       AND (
        A2.keyword = 'keyword1' || A2.keyword = 'keyword2' 
       ) THEN 
        1 
       ELSE 
        0 
       END 
      ) 
     FROM 
      tbl_article_tags A2 
    ) AS KW_MATCHED 
FROM 
    tbl_article A1 
WHERE 
    KW_MATCHED > 0 
ORDER BY 
    KW_MATCHED DESC 

есть ли способ сделать это? Благодаря передовой и извините за мой плохой английский :)

+0

Пожалуйста, не говори «возвращает ошибку»: скопировать сообщение об ошибке в этом вопросе. –

+1

вопрос отредактировал –

ответ

0

Попробуйте использовать HAVING вместо WHERE

SELECT 
A1.*, 
(SELECT sum(case when (A1.ID=A2.tag_id) AND (A2.keyword='keyword1' || A2.keyword='keyword2') then 1 else 0 end) FROM tbl_article_tags A2) as KW_MATCHED 
FROM tbl_article A1 
HAVING KW_MATCHED > 0 
ORDER BY KW_MATCHED DESC 
+0

что это? Вау. Большое вам спасибо! –

+0

Обратите внимание, что есть некоторые незначительные отличия в отношении того, как работает WHERE & HAVING, но я не думаю, что это будет проблемой для псевдонима для столбца подзапроса. См. Http://stackoverflow.com/questions/2905292/where-vs-having/18710763#18710763 – PaulF

+0

Да, теперь я могу получить разницу. Тогда я попытаюсь провести тесты. –

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