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

및 다음과 같은 데이터를 만들 SQL 쿼리를 작성하는 방법은 무엇입니까?SQL (s)을 사용하여 태그 관계 결과를 얻는 방법은 무엇입니까?

Table tags_relations: 

tag1  tag2  relations_degree 
Language C++  2 
Language Java 1 

note : 태그가 동일한 기사를 참조하면 relations_degree + 1

이 접근법의 목적은 태그 사이의 관계를 계산하는 것입니다.

답변

3

뭔가 같은 : 귀하의 예제를 바탕으로

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 

, 당신이 그렇지 = 자바,이 tag2 = C++, relations_degree = 1이 tag1의 경우가있다 = '언어'tag1로로 제한하고 가정 그 얻을 :

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

감사합니다. 일종의 권리입니다. 하지만 왼쪽 조인이 더 좋을지 설명 할 수 있습니까? 또한 A.tag> B.tag는 무엇입니까? 감사. –

+0

결과를 고유하게 만들기 위해 a.tag> b.tag를 추가했습니다. 그렇지 않으면 "언어 C++ 2"와 나중에 "C++ 언어 2"처럼 보이는 결과 집합의 행을 가지게됩니다. 원하지 않는다고 가정합니다. 이 경우 내부 조인은 relations_degree> = 1 인 결과 만 보게되는 반면, 왼쪽 조인으로 전환하면 "Language NULL 1"과 같은 행이 표시됩니다. 아마도 원하지 않을 것입니다. – Dathan

0

을 당신이 "태그 유형"의 일종을 가지고해야한다고 생각, 당신의 세트가 더 좋아 보이도록 :

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

그러면 을 그룹화하여 tag_typetag으로 쉽게 사용할 수 있습니다.

다른 tag_type이 여러 개 있다고 가정하고 (예 : U와 ME에서 PRES를 만들지 않고), tag_types를 태그에 가장 잘 할당하는 방법을 잘 모르겠습니다. . 그러나 이것은 확실히가는 길입니다.

+0

답변을 주셔서 감사합니다. 그러나 여기서는 태그 사이의 관계를 알아내어 각 태그에 대해 tag_type이 없기 때문에 어렵습니다. '언어', '자바'는 한 기사의 태그입니다. –

+0

아, 오케이 ... 오해했습니다. 나는 당신이 "자바 언어가 있고, C++ 언어가있다"고 생각했다. 그래서 자바와 C++이 같은 기사에 함께 등장했다면, 그것도 나타나기를 바랄 것입니다. –

+0

예, 저는 지금 당신이 의미하는 바를 알고 있습니다. –