2013-07-25 3 views
0

Я использую следующий запрос для поиска блогов, содержащих определенные слова в их названиях. Каждое слово записывается как уникальное в тегах таблицы, а затем ссылается на фактический блог в таблице tags_titles. t.label - это место, где хранятся фактические слова тега.Mysql - поиск блогов по тегам

По какой-то причине этот запрос не дает никаких результатов, если я не введу число, и в этом случае он создает все блоги без фильтрации. Как я могу заставить это работать?

SELECT tt.blog_id, b.title, COUNT(*) AS total_matches 
FROM tags_titles AS tt 

INNER JOIN tags AS t 
ON tt.tag_id = t.tag_id 

LEFT JOIN blogs AS b 
ON tt.blog_id=b.blog_id 

WHERE t.label IN ('boats','planes') 
GROUP BY tt.blog_id 
ORDER BY total_matches DESC 
+0

Возможно, вам нужно использовать 'WHERE t.label LIKE '% boat%' ИЛИ ​​t.label LIKE '% plane%''? – fthiella

+0

Я не хочу использовать LIKE из-за потери производительности. Это могут быть точные совпадения, которые не будут проблемой! :) –

+0

Что значит «если я не вводил число» .. где вы вставляете номер? – mcriecken

ответ

1

Я думаю, что вы хотите right join, а не left join и исправить некоторые другие детали в запросе:

SELECT b.blog_id, b.title, COUNT(t.label) AS total_matches 
FROM tags_titles tt INNER JOIN 
    tags t 
    ON tt.tag_id = t.tag_id RIGHT JOIN 
    blogs b 
    ON tt.blog_id=b.blog_id and 
     t.label IN ('boat','plane') 
GROUP BY b.blog_id 
ORDER BY total_matches DESC; 

Вы просите что-то на уровне блога. Тем не менее, объединение вместо этого сохраняет все теги, а не блоги. Как только это переключится на блоги, total_matches подсчитывает количество совпадающих тегов, чтобы получить счетчик (count(*) никогда не вернет 0 в этом случае, потому что не будет строки).

Если вы хотите хотя бы одно совпадение, укажите having total_matches > 0.

+0

это производит все блоги и с полными совпадениями как 0, не делает никакой фильтрации, я думаю :) –

+0

@AmyNeville. , , См. Заключительный комментарий. Или измените 'right join' на' inner join'. –

+0

такой же результат, если я использую правое соединение или внутреннее соединение –

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