Получение связанных тегов из SQL Server после фильтрации - PullRequest
2 голосов
/ 31 октября 2009

Я задавал этот вопрос раньше и получил отличный рабочий ответ.

что такое запрос для получения "связанных тегов", как при переполнении стека

но я понял, что SOF на самом деле делает еще один шаг вперед, поскольку он поддерживает развертывание нескольких тегов

что я имею в виду, если нажать на тег C # , это отфильтрует до 20 000 вопросов и покажет мне все связанные теги по вопросам, которые также имеют C # в качестве тега ,

но затем я могу нажать на тег " Collections " и посмотреть общее количество вопросов с тегами " C # " и " Collections " , может быть, что 500 вопросов

кроме того, он все равно покажет мне связанные теги, которые являются тегами, которые существуют в вопросах, которые также имеют теги " C # " и " Collections "

и вы можете продолжать фильтровать.

поэтому ответ в приведенной выше ссылке, поддерживает только один тег.

в sql, как заставить это работать, чтобы иметь возможность полностью развернуть и показать количество связанных тегов и позволить пользователю продолжать выбирать дополнительные теги для развертки.

Ответы [ 3 ]

4 голосов
/ 31 октября 2009

Я бы использовал что-то вроде этого в качестве первой версии. @FirstTagID и @SecondTagID должны быть отсортированы по ID. Вы можете запросить больше тегов, добавив больше соединений к внутреннему запросу.

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 t1.tagID=@FirstTagID AND t2.tagID=@SecondTagID
    )
    AND tagID!=@FirstTagID AND tagID!=@SecondTagID
)

Или, если вы хотите указать количество ссылок:

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 t1.tagID=@FirstTagID AND t2.tagID=@SecondTagID
    )
    AND t.tagID!=@FirstTagID AND t.tagID!=@SecondTagID
GROUP BY t.tagName

То же самое для трех тегов:

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 t1.tagID=@FirstTagID AND t2.tagID=@SecondTagID AND t3.tagID=@ThirdTagID
    )
    AND t.tagID!=@FirstTagID AND t.tagID!=@SecondTagID AND t.tagID!=@ThirdTagID
GROUP BY t.tagName
1 голос
/ 31 октября 2009

Допустим, у вас есть таблица с именем entity_tags, связывающая entities с tags следующим образом:

entity_id : INTEGER
tag_id    : INTEGER

Допустим, вы пользователь как выбранные N тегов @ 1, @ 2, ... @N. Чтобы получить другие теги, связанные с результатами (и в качестве бонуса, их частоту появления):

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 et1.tag_id=@1)
 ...
 JOIN entity_tags AS etN ON (etN.entity_id=et.entity_id AND etN.tag_id=@N)
WHERE et.tag_id NOT IN (@1, @2, ... @N)
GROUP BY et.tag_id;
0 голосов
/ 01 ноября 2009
 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
 )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...