mysql WHERE один столбец IN (SELECT два столбца)

246
11 января 2018, 19:36

Всем привет! Сейчас изучаю sql, столкнулся с проблемой. Есть 3 таблицы:

  1. photos - таблица с ID картинок (которые надо получить в финале)
  2. tags- таблица с именем (tag_name) и ID уникальных тегов
  3. tags_rel - таблица с отношениями photo_id -> tag_id

Делаю поиск по тегам. Пример: man, horse, riding и мне необходимо вывести фотографии по количеству теговвстречающихся у этой фотографии.

SELECT id FROM photos WHERE id IN (SELECT photo_id FROM tags_rel WHERE tag_id in ( SELECT id FROM tags WHERE tag_name='man' OR tag_name='riding' OR tag_name='horse') GROUP BY photo_id ORDER BY COUNT(photo_id) DESC)

Данный запрос не сортирует по количеству. С этим отлично справляется запрос:

SELECT photo_id, COUNT(*) FROM tags_rel WHERE tag_id in ( SELECT id FROM tags WHERE tag_name='man' OR tag_name='riding' OR tag_name='horse') GROUP BY photo_id ORDER BY COUNT(*) DESC

Но если к нему подставить

SELECT id FROM photos WHERE id IN (SELECT photo_id, COUNT(*) ... )

запрос перестает работать, т.к. в данном случае, IN необходима одна колонка, а не две.

Как решить проблему?

Answer 1
SELECT t.photo_id, COUNT(*) 
FROM photos p, tags_rel t
WHERE p.id = t.photo_id
  AND t.tag_id in ( SELECT id 
                    FROM tags 
                    WHERE tag_name IN ('man', 'riding', 'horse')
                  ) 
GROUP BY t.photo_id 
ORDER BY COUNT(*) DESC

В принципе я бы и от второго IN рекомендовал избавиться аналогичным образом.

READ ALSO
C# Асинхронные сокеты

C# Асинхронные сокеты

Изучаю пример от MSDN:

281
WCF, WCF Data Services - понимание

WCF, WCF Data Services - понимание

Привет! Изучаю службы WCF, море информации в короткие сроки и накопилось множество вопросов, которые надо уложить в головеИспользую EF 6 (Database...

164
В ком. порт приходят нe те значения

В ком. порт приходят нe те значения

Мне необходимо собрать некую программу для управления светом и тд

194
Как в С# получить ответ от метода из Objective-C

Как в С# получить ответ от метода из Objective-C

Создаю игру в Unity3D, есть модуль на Objective-C, который возвращает bool

188