2016-02-22 4 views
7

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

a busy cat

В моей tags_xref таблице мне нужно иметь 3 различные столбцы для каждого типа поста, потому что дискуссия может иметь тот же идентификатор, как рассказ или статью.

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

"SELECT t.id, t.tag, COUNT(discussion_id) AS cnt 
    FROM tags_xref AS xrf 
    INNER JOIN tags AS t ON xrf.tag_id = t.id 
    GROUP BY t.id, t.tag 
    ORDER BY COUNT(discussion_id) DESC LIMIT 20" 

Теперь я хочу, чтобы показать самые популярные теги на всем сайте, так что из дискуссий, рассказов и статей. Есть ли кто-нибудь, кто может мне помочь? Я работаю над этим часами и не могу найти решение. Спасибо!

+0

Вы могли бы предоставить весь запрос на создание таблицы здесь с образцами данных? –

ответ

4

Вы можете сделать простую модификацию к вашему запросу:

SELECT t.id, t.tag, COUNT(*) AS cnt 
FROM tags_xref xrf INNER JOIN 
    tags t 
    ON xrf.tag_id = t.id 
GROUP BY t.id, t.tag 
ORDER BY COUNT(*) DESC 
LIMIT 20; 

Предположительно, различные идентификаторы NULL, когда они не подходят. Если по какой-то странной причине вы фактически сохранили значения во всех трех идентификаторах для данного xref, вы можете сделать следующее:

SELECT t.id, t.tag, 
     (COUNT(story_id) + COUNT(discussion_id) + COUNT(article_id)) AS cnt 
FROM tags_xref xrf INNER JOIN 
    tags t 
    ON xrf.tag_id = t.id 
GROUP BY t.id, t.tag 
ORDER BY cnt DESC 
LIMIT 20; 
+0

Ты мой герой, это прекрасно работает! Действительно, идентификаторы, которые не подходят, обычно являются NULL, но я буду строить эту безопасность. Еще раз спасибо! –

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