Как получить результаты отношений тегов, просто используя SQL(s)?

Table tags:
article_id     tag
1              Language
1              Java
1              c++
2              Language
2              c++
3              c++

и как я могу написать запрос (ы) SQL(s), чтобы сделать данные, как показано ниже:

Table tags_relations:

tag1        tag2     relations_degree
Language    C++     2
Language    Java    1

примечание: если тег относится к той же статье, то Relations_степень + 1

Цель этого подхода - вычислить отношения между тегами, может ли кто-нибудь помочь мне в этом?


person Shuoling Liu    schedule 24.12.2009    source источник


Ответы (2)


Что-то вроде:

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

Основываясь на вашем примере, я предположил, что вы ограничиваете его tag1 = 'Language', в противном случае есть случай tag1 = Java, tag2 = c++, Relations_степень = 1. Чтобы получить это:

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
person Dathan    schedule 24.12.2009
comment
Спасибо, вроде правильно. Но можете ли вы объяснить, будет ли левое соединение лучше или? И что делает A.tag › B.tag? Спасибо. - person Shuoling Liu; 24.12.2009
comment
Я добавил a.tag › b.tag, чтобы результаты были уникальными. В противном случае в результирующем наборе будут строки, похожие на язык C++ 2, а затем на язык C++ 2, что, как я полагаю, вам не нужно. И в этом случае внутреннее соединение приведет к тому, что вы увидите только результаты с отношениями_степени ›= 1, тогда как переключение на левое соединение покажет вам строки, такие как Language NULL 1, что вам, вероятно, не нужно. - person Dathan; 24.12.2009

Я думаю, у вас должен быть какой-то «Тип тега», чтобы ваш набор выглядел примерно так:

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

Тогда вы могли бы просто использовать COUNT(*), группируя по tag_type и tag.

Предполагая (не пытаясь сделать PRES из U и ME), что у вас есть куча других tag_types, тогда я не уверен, как лучше всего назначать tag_types тегам, и вам, вероятно, это покажется проще, чем мне. Но это определенно правильный путь.

person Rob Farley    schedule 24.12.2009
comment
Спасибо за ответ, но здесь сложно просто выяснить отношения между тегами, поэтому для каждого тега нет tag_type. «язык», «java» — это теги одной статьи. - person Shuoling Liu; 24.12.2009
comment
Ах, хорошо... Я неправильно понял. Я думал, вы имеете в виду, что есть язык Java, а есть язык C++. Итак, если бы Java и C++ появились вместе в одной статье, вы бы хотели, чтобы это тоже появилось? - person Rob Farley; 24.12.2009
comment
Да, я знаю, что вы c то, что я имею в виду сейчас. - person Shuoling Liu; 24.12.2009