2008-10-29 10 views
5

Nous pouvons marquer une question avec plusieurs tags sur le site StackOverflow, je me demande comment trouver les questions les plus proches avec des tags communs.Comment trouver les notices avec les tags les plus courants, comme les questions associées dans StackOverflow

Supposons que nous avons 100 questions dans une base de données, chaque question a plusieurs balises. Supposons que l'utilisateur consulte une question spécifique et que nous souhaitons que le système affiche les questions correspondantes sur la page. Les critères de la question connexe sont les tags les plus courants. Par exemple: La question 1 est identifiée avec AAA, BBB, CCC, DDD, EEE.

La question 2 est liée au top 1 car elle contient également toutes ces 5 balises. La question 3 est liée au top 2 parce qu'elle n'a que 4 ou 3 balises que Questio1 possède. ......

Donc, ma question est de savoir comment concevoir la base de données et de trouver rapidement les questions liées à la question 1. Merci beaucoup.

Répondre

0

Vous n'êtes pas tout à fait sûr de savoir ce que vous voulez dire, mais the Tags page répertorie les tags par ordre de popularité (en nombre de tags).

Éditer: est-ce à propos de SO ou sur votre propre application? S'il s'agit de votre propre application, supprimez la balise SO car elle est trompeuse.

Edit2: Je dirais quelque chose comme:

SELECT * FROM `questions` WHERE `tag` LIKE '%tagname%' OR (looped for each tag) LIMIT 5,0 

Où 5 est le maximum de résultats que vous voulez revenir (pour au moins une optimisation). Probablement pas la meilleure solution, mais je pouvais le voir fonctionner.

Vous pouvez également essayer un match LIKE en utilisant le titre.

9

Peut-être quelque chose comme:

select qt.question_id, count(*) 
from question_tags qt 
where qt.tag in 
(select qt2.tag 
    from question_tags qt2 
    where qt2.question_id = 123 
) 
group by qt.question_id 
order by 2 desc 
3

Si vous pouvez garantir qu'il n'y a pas double emploi avec des balises pour une question, vous pouvez effectuer les opérations suivantes:

SELECT 
    QT2.question_id, 
    COUNT(*) AS cnt 
FROM 
    Question_Tags QT1 
INNER JOIN Question_Tags QT2 ON QT2.tag = QT1.tag AND QT2.question_id <> QT1.question_id 
WHERE 
    QT1.question_id = @question_id 
GROUP BY 
    QT2.question_id 
ORDER BY 
    cnt DESC 

Si vous ne pouvez pas garantir l'unicité des étiquettes dans une question, alors la solution de Tony Andrews fonctionnera. Sa volonté fonctionnera dans tous les cas, mais vous devriez comparer les performances de votre système avec cette méthode si vous pouvez faire la garantie de l'unicité par des contraintes.

Questions connexes