2010-01-23 12 views
7

ho i miei tag disegnate come questo nel mio database:Come implementare tag contare

Table: Item 
Columns: ItemID, Title, Content 

Table: Tag 
Columns: TagID, Title 

Table: ItemTag 
Columns: ItemID, TagID 



//example -- this is the right sidebar of stackoverflow 
c# × 59279 
sql × 14885 
asp.net-mvc × 9123 
linq × 4337 
tags × 339 

se volevo conoscere il conteggio di ogni tag ad esempio come StackOverflow conta i loro tag come lo farei? Che tipo di query dovrei eseguire. Sono aperto ad entrambi sql regolare e LINQ

+0

Qual è esimo e rapporto dei tavoli? –

risposta

4

Aggiungi un'altra colonna nella tabella Tag che funziona come contatore. Quando si aggiunge o si rimuove un tag da un elemento si aggiorna il contatore (in altre parole, quando si aggiunge una riga sul Itemtag incrementa il contatore sul tavolo Tag, quando rimuova decrementare il contatore)

tag metti in oggetto:

tag
INSERT INTO Itemtag (itemid,tagid) VALUES ('$itemid','$tagid'); 
UPDATE Tag SET counter=counter+1 WHERE tagid='$tagid'; 

rimuovere dalla voce

DELETE FROM Itemtag WHERE itemid='$itemid' AND tagid='$tagid'; 
UPDATE Tag SET counter=counter-1 WHERE tagid='$tagid'; 

recuperare i tag voce con contatore

SELECT t.title, t.counter FROM Itemtag AS it JOIN Tag AS t ON t.idtag=it.tagid 
WHERE it.itemid='$itemid' 
+0

grazie bit d'angelo – Luke101

3
select t.Title, count(it.TagID) as TagCount 
from Tag t 
    inner join ItemTag it on t.TagID = it.TagID 
    inner join Item i on it.ItemID = i.ItemID 
where i.ItemID = @currentItemID -- optional, if you only want current page 
group by t.Title 
+1

Bello! Sarà così difficile sul database se avrò migliaia di post e tag? – Luke101

+0

Il conteggio su ogni query ucciderà il database quando saranno presenti più di 10 righe per tabella. ;) Angelbit ha pubblicato la soluzione migliore. – Crozin

+0

In realtà sono d'accordo sul fatto che l'approccio di Angelbit sia migliore ... è lo stesso modo in cui i database distribuiti su larga scala (ad es. BigTable) consigliano di gestire i report sui conteggi degli articoli. Stavo solo cercando di scrivere la domanda che stavi chiedendo. :) –

0

È possibile utilizzare un'altra colonna in Item per memorizzare conteggio tag e sincronizzare quando aggiungere o rimuovere i tag.

0
SELECT title, count(*) FROM tag 
JOIN itemtag ON itemtag.tagid = tag.tagid 
GROUP BY title 
Problemi correlati