2009-12-24 13 views
1
Table tags: 
article_id  tag 
1    Language 
1    Java 
1    c++ 
2    Language 
2    c++ 
3    c++ 

et comment rendre les données comme ci-dessous puis-je écrire requête SQL (s) (s):Comment obtenir les résultats des relations de tags simplement en utilisant SQL (s)?

Table tags_relations: 

tag1  tag2  relations_degree 
Language C++  2 
Language Java 1 

Note: si la balise se réfère au même article, l'relations_degree + 1

Le but de cette approche est de calculer les relations entre les balises, quelqu'un peut-il m'aider à ce sujet?

Répondre

3

Quelque chose comme:

SELECT A.tag AS tag1, B.tag AS tag2, COUNT(*) as relations_degree 
FROM tags A 
    INNER JOIN tags B ON A.article_id = B.article_id 
WHERE A.tag = 'Language' AND a.tag <> b.tag 
GROUP BY A.tag, B.tag 
ORDER BY B.tag ASC 

Sur la base de votre exemple, je suppose que vous limitiez à balise1 = 'Langue', sinon il y a le cas de balise1 = Java, tag2 = C++, relations_degree = 1. obtenir que:

SELECT A.tag AS tag1, B.tag AS tag2, COUNT(*) as relations_degree 
FROM tags A 
    INNER JOIN tags B ON A.article_id = B.article_id 
WHERE A.tag > b.tag 
GROUP BY A.tag, B.tag 
ORDER BY B.tag ASC 
+0

Merci, c'est un peu juste. Mais pouvez-vous expliquer si la participation de gauche sera meilleure ou? Que fait le A.tag> B.tag? Merci. –

+0

J'ai ajouté le a.tag> b.tag pour rendre les résultats uniques. Sinon, vous auriez des lignes dans le jeu de résultats qui ressemblent à "Language C++ 2" et plus tard à "C++ Language 2", ce que je suppose que vous ne voulez pas. Et dans ce cas, la jointure interne aura pour résultat que vous ne verrez que des résultats avec relations_degree> = 1, alors que passer à une jointure gauche vous montrera des lignes comme "Language NULL 1", que vous ne voulez probablement pas. – Dathan

0

Je pense que vous devriez avoir une sorte de "type Tag", de sorte que votre jeu ressemble plus:

article_id tag tag_type 
1   Java Language 
1   c++ Language 
2   c++ Language 
3   c++ Other 

Ensuite, vous pouvez facilement utiliser COUNT(*), en regroupant par tag_type et tag. En supposant (sans essayer de faire un PRES de U et ME) que vous avez un tas d'autres tag_types, je ne sais pas comment assigner tag_types aux tags, et vous trouverez probablement cela plus facile que moi . Mais c'est définitivement le chemin à parcourir.

+0

Merci pour la réponse, mais le difficile ici est de simplement trouver les relations entre les balises, donc il n'y a pas de tag_type pour chaque balise. 'language', 'java' sont les tags d'un article. –

+0

Ah, ok ... j'ai mal compris. Je pensais que tu voulais dire "Il y a le langage Java, et il y a le langage C++". Donc, si Java et C++ sont apparus ensemble sur le même article, vous voudriez que cela apparaisse aussi? –

+0

Oui, je sais ce que je veux dire maintenant. –