Если вы хотите, чтобы пять тем имели больше общего с данной темой, вы можете попробовать что-то вроде:
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.