2009-10-31 4 views
2

J'ai déjà posé cette question et j'ai obtenu une excellente réponse.Obtention de balises associées à partir de SQL Server lorsque vous avez filtré

what is the query to get "related tags" like in stack overflow

mais j'ai réalisé que SOF se fait un peu plus loin car il soutient l'étiquette multiple drilldown

ce que je veux dire est, si cliquez sur l'étiquette C#, qui filtrera 20.000 des questions et il va me montrer tous les tags liés sur des questions qui ont aussi C# comme une balise.

mais, je peux cliquer sur le tag "Collections" et voir maintenant nombre total de questions avec le tag "C#" et "Collections". peut-être que 500 questions

en plus, il va me montrer encore des balises connexes, qui sont des balises qui existent dans les questions qui ont également tag « C# » et « Collections »

et vous pouvez garder le filtrage vers le bas.

donc la réponse dans le lien ci-dessus, ne supporte que 1 seule étiquette.

en sql Comment cela fonctionnerait-il pour pouvoir explorer complètement et montrer le nombre de balises associées et permettre à l'utilisateur de continuer à choisir des balises supplémentaires pour le forage?

Répondre

4

J'utiliserais quelque chose comme ça comme première version. @FirstTagID et @SecondTagID doivent être triés par ID. Vous pouvez interroger sur plus de balises en ajoutant plus de jointures à la requête interne.

SELECT tagName 
FROM tags 
WHERE id IN (
    SELECT tagID 
    FROM tagsBridge 
    WHERE linkID IN (
     SELECT t1.linkID 
     FROM 
      tagsBridge t1 
      JOIN tagsBridge t2 ON t2.linkID=t1.linkID AND t2.tagID > t1.tagID 
     WHERE [email protected] AND [email protected] 
    ) 
    AND [email protected] AND [email protected] 
) 

Ou si vous voulez inclure le nombre de liens:

SELECT t.tagName, count(*) 
FROM 
    tags t 
    JOIN tagsBridge tb ON tb.tagID = t.id 
WHERE 
    tb.linkID IN (
     SELECT t1.linkID 
     FROM 
      tagsBridge t1 
      JOIN tagsBridge t2 ON t2.linkID=t1.linkID AND t2.tagID > t1.tagID 
     WHERE [email protected] AND [email protected] 
    ) 
    AND [email protected] AND [email protected] 
GROUP BY t.tagName 

Même chose pour trois tags:

SELECT t.tagName, count(*) 
FROM 
    tags t 
    JOIN tagsBridge tb ON tb.tagID = t.id 
WHERE 
    tb.linkID IN (
     SELECT t1.linkID 
     FROM 
      tagsBridge t1 
      JOIN tagsBridge t2 ON t2.linkID=t1.linkID AND t2.tagID > t1.tagID 
      JOIN tagsBridge t3 ON t3.linkID=t2.linkID AND t3.tagID > t2.tagID 
     WHERE [email protected] AND [email protected] AND [email protected] 
    ) 
    AND [email protected] AND [email protected] AND [email protected] 
GROUP BY t.tagName 
+0

la deuxième requête fonctionne ici parfaitement pour 2 mais je voulais préciser comment cela fonctionnerait pour 3. Je suppose que je dois ajouter "et" pour la ligne où t1.tagID ainsi que la ligne "and t.tagid! -" mais où est-ce que je mets les autres jointures. Si vous pouviez clarifier le sql pour 3 tags, je devrais être en mesure d'obtenir le modèle ici – leora

+1

Mis à jour la réponse. –

+0

excellente réponse. .fait comme un charme – leora

1

Disons que vous avez une table appelée entity_tags reliant entities à la tags comme ceci:

entity_id : INTEGER 
tag_id : INTEGER 

Disons que l'utilisateur a sélectionné N tags @ 1, @ 2, ... @N. Pour obtenir les autres balises associées aux résultats (et en prime, leur fréquence d'apparition):

SELECT et.tag_id, COUNT(et.entity_id) as frequency FROM 
entity_tags AS et 
JOIN entity_tags AS et1 ON (et1.entity_id=et.entity_id AND [email protected]) 
... 
JOIN entity_tags AS etN ON (etN.entity_id=et.entity_id AND [email protected]) 
WHERE et.tag_id NOT IN (@1, @2, ... @N) 
GROUP BY et.tag_id; 
0
SELECT t.tagName 
FROM tags t INNER JOIN tagsBridge tb on t.id=tb.tagID 

where tb.linkID in (

    select tb.linkID from tagsBridge tb 
    where tb.tagID= @first_tag 

    intersect 

    select tb.linkID from tagsBridge tb 
    where tb.tagID= @second_tag 

    intersect 

    select tb.linkID from tagsBridge tb 
    where tb.tagID= @third_tag 

    intersect 

    select tb.linkID from tagsBridge tb 
    where tb.tagID= @fourth_tag 

    --- // you can continue 
) 

) 
Questions connexes