2013-07-01 2 views
0

Мне нужно сделать запрос, который будет соответствовать блогам, которые соответствуют tag_id в таблице tags_blogs. Существует еще одна таблица, в которой содержатся теги, которые меня не интересуют на данном этапе.Подсчет совпадений в mysql

Как принимать эту таблицу содержания:

reference_id tag_id blog_id 
1    1  1 
2    2  1 
3    10  6 
4    11  6 
5    10  7 
6    11  7 
7    11  8 

И вернуть это где (например) blog_id = 6:

blog_id total_matches 
7   2 
8   1 

Другими словами вернуть идентификаторы любого блога, которые соответствие tag_id параметру при условии, а также количество совпадений.

Это код, который я до сих пор (я далеко до сих пор):

SELECT blog_id FROM tags_blogs WHERE blog_id = 6 
+0

Ok I» вы только что поняли, что ответы до сих пор не делают то, что здесь задают - WHERE blog_id = 6 возвращает только blog_id, а это 6, тогда как мне нужно количество совпадений тегов для блогов, отличных от 6. Я хочу предоставить упорядоченный список подобных блогов ... –

ответ

1

От ваших комментариев, здесь больше похоже на то, что вы ищете. Обратите внимание, что данный запрос не обязательно оптимален

select tb.blog_id, count(*) 
    as total_matches 
    from tags_blogs tb 
    where tag_id in (select distinct tag_id from tags_blogs where blog_id = 6) 
    and blog_id != 6 
    group by blog_id 

Link to SQL Fiddle

Вы можете обнаружить, что это немного более эффективным в некоторых случаях, или проще создать:

select tb.blog_id, count(*) 
    as total_matches 
    from tags_blogs tb 
    join tags_blogs tb1 on tb1.tag_id = tb.tag_id and tb1.blog_id != tb.blog_id 
    where tb1.blog_id = 6 
    group by tb.blog_id; 
+0

Это возвращает только количество тегов из blog_id = 6. Пытается составить список подобных блогов здесь с поэтому я могу заказать их в соответствии с тем, насколько хорошо они соответствуют –

+0

еще раз спасибо :) –

+0

Почему вы «отличны» в первом запросе? – zerkms

2

Вам нужно подзапрос, чтобы выбрать все 6 (или любой другой идентификатор блога) теги и если блог имеет tag ID IN, в который вставляется подзапрос, затем группирует одинаковые blog_ids вместе и подсчитывает их.

SELECT 
    a.blog_id, 
    count(*) as total_matches 
FROM 
    tags_blogs as a 
WHERE 
    a.tag_id IN 
    (SELECT tag_id FROM tags_blogs WHERE b.blog_id=6) AND 
    a.blog_id!=6 
GROUP BY a.blog_id 

будет возвращать результаты как

blog_id total_matches 
7   2 
8   2 
+0

J Уст понял, что это не работает. –

+0

каким образом это не работает? –

+0

@AmyNevill, group by tag_id, если вы хотите подсчет количества тегов в каждом блоге –

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