2016-02-22 10 views
7

Na mojej stronie mam trzy duże sekcje: sekcję, gdzie ludzie mogą rozpocząć dyskusje, sekcję, w której mogą dzielić się historiami i blogiem z artykułami, które sam piszę. Zbudowałem niestandardowy system znakowania, korzystając ze struktury bazy danych poniżej.Jak zdobyć najbardziej popularne tagi ze znormalizowanych tabel?

a busy cat

W moim stole tags_xref Musiałem mieć 3 różne kolumny dla każdego typu post, bo dyskusja może mieć ten sam identyfikator jako opowieść lub artykułu.

Wszystko działa dokładnie tak, jak powinno, ale mam problemy z zapytaniami, aby wyświetlić określone tagi. Już wiem jak pokazać najpopularniejsze tagi w dziale dyskusyjnym:

"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" 

Teraz chcę pokazać najpopularniejsze tagi na całej stronie, więc z rozmów, opowiadań i artykułów. Czy jest ktoś, kto może mi w tym pomóc? Pracuję nad tym od wielu godzin i nie mogę znaleźć rozwiązania .. Dzięki!

+0

Czy mógłbyś podać tutaj wszystkie zapytania do tabeli tworzenia z przykładowymi danymi? –

Odpowiedz

4

Można zrobić prostą modyfikację zapytania:

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; 

Można przypuszczać, że różne identyfikatory są NULL gdy nie są właściwe. Jeśli z jakiegoś dziwnego powodu faktycznie zapisałeś wartości we wszystkich trzech identyfikatorach dla danego odnośnika, możesz to zrobić:

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

Jesteś moim bohaterem, to działa idealnie! Rzeczywiście, identyfikatory, które nie są odpowiednie, są zwykle NULL, ale będę budować w tym bezpieczeństwie. Dzięki jeszcze raz! –

Powiązane problemy