Генерация SQL-запроса для получения связанных результатов - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть система галереи тем. Мне нужно реализовать элемент «связанные темы» на странице предварительного просмотра темы.

Каждая тема имеет цвета и теги, поэтому у меня есть 5 таблиц:

  • Тема

    • id_theme
    • название
  • цвет

    • id_color
    • заголовок (красный)
  • бирка

    • id_tag ​​
    • название (планеты)
  • theme_color

    • id_theme
    • id_color
  • theme_tag

  • id_tag ​​

Загвоздка в том, что мне нужно получить только 5 результатов, и они должны показать те, которые имеют больше совпадений между цветами и тегами. С этим требованием я понятия не имею, с чего начать. Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Если вы хотите, чтобы пять тем имели больше общего с данной темой, вы можете попробовать что-то вроде:

DECLARE @target_id_theme INT;
SET @target_id_theme = 1; -- this is the id_theme you want to find similar themes for

SELECT t.id_theme, COUNT(*) as matching_things
FROM theme AS t
LEFT OUTER JOIN theme_color AS tc ON tc.id_theme = t.id_theme
LEFT OUTER JOIN theme_tag AS tt ON tt.id_theme = t.id_theme
WHERE tc.id_color IN (SELECT id_color FROM theme_color WHERE id_theme = @target_id_theme)
OR tt.id_tag IN (SELECT id_tag FROM theme_tag WHERE id_theme = @target_id_theme)
GROUP BY t.id_theme
ORDER BY COUNT(*) DESC
LIMIT 5

Не проверено, покупатель остерегается, но я надеюсь, что вы поняли идею.Это создает строку для каждого цвета или тега, которая соответствует цвету или тегу, назначенному @target_id_theme, упорядочивает их по убыванию и дает вам верхние 5.

0 голосов
/ 24 февраля 2011

Попробуйте это:

SELECT * FROM theme t
   FULL OUTER JOIN theme_color tc ON tc.id_theme = t.id_theme
   INNER JOIN color c ON c.id_color = tc.id_color
   FULL OUTER JOIN theme_tag tt ON tt.id_theme = t.id_theme
   INNER JOIN tag ta ON ta.id_tag = tt.id_tag
WHERE tag LIKE '%' + @KEYWORD + '%' OR color LIKE '%' + @KEYWORD + '%' OR title LIKE '%' + @KEYWORD + '%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...