2010-01-23 13 views
7

he mis etiquetas desinged como esto en mi base de datos:la forma de aplicar la etiqueta contando

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 

si quería saber el recuento de cada etiqueta, tales como la forma en stackoverflow cuenta sus etiquetas de cómo lo haría? ¿Qué tipo de consulta realizaría? Estoy abierto a ambos SQL regular y LINQ

+0

¿Cuál es º e relación de las tablas? –

Respuesta

4

Agregue otra columna en la tabla Etiquetas que funcionan como contador. Al agregar o eliminar una etiqueta de un elemento de actualizar el contador (en otras palabras, cuando se agrega una fila en Itemtag incrementar el contador en la tabla de variables cuando quite disminuir el contador)

etiqueta añadir a tema:

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

retirar del elemento

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

recuperar las etiquetas de artículos con contador

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

gracias angel bit – 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

¡Agradable! ¿Será esto difícil en la base de datos si tengo miles de mensajes y etiquetas? – Luke101

+0

Contar con cada consulta matará a su base de datos cuando habrá más de 10 filas por tabla. ;) Angelbit publicó la mejor solución. – Crozin

+0

De hecho, estoy de acuerdo en que el enfoque de Angelbit es mejor ... es lo mismo que las bases de datos distribuidas a gran escala (por ejemplo, BigTable) recomiendan tratar los informes sobre el recuento de elementos. Solo intentaba escribir la consulta que me pedías. :) –

0

Puede utilizar otra columna en Item para almacenar y sincronizar etiqueta contar cuando agregar o quitar las etiquetas.

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