2016-01-06 3 views
0

У меня есть SQL-запрос для поиска проектов на основе тегов. Он работает нормально, если какой-либо из тегов соответствует.SQL-поиск для всех проектов, у которых есть все указанные теги

SELECT * 
FROM projects 
WHERE projects.id IN (SELECT taggable_id 
         FROM taggings 
         WHERE taggable_type='Project' 
         AND taggable_id=projects.id 
         AND taggings.tag_id IN (1, 2, 3)) 

Есть три таблицы, Taggings с колоннами id, taggable_id, taggable_type, tag_id; Tags с колонками id, name; и Projects с колонками id, name, description.

Я хочу, чтобы искать все проекты, для которых назначены все 3 тега.

Спасибо.

+2

я удалил лишние теги базы данных. Не стесняйтесь добавлять тег для базы данных, которую вы действительно используете. –

ответ

3

Вы можете сделать это, сославшись на количество совпадений. Ваш подзапрос является избыточным при сравнении с p.id (выполняется как IN, так и по предложению корреляции). Вот один способ:

SELECT p.* 
from projects p 
WHERE 3 = (SELECT COUNT(*) 
      FROM taggings t 
      WHERE t.taggable_type = 'Project' AND 
       t.taggable_id = p.id AND 
       t.tag_id IN (1, 2, 3) 
     ); 

Вы также можете сделать это с помощью IN:

SELECT p.* 
from projects p 
WHERE p.id = (SELECT t.taggable_id 
       FROM taggings t 
       WHERE t.taggable_type = 'Project' AND 
        t.tag_id IN (1, 2, 3) 
       GROUP BY t.taggable_id 
       HAVING COUNT(*) = 3 
      ); 
+1

Спасибо, Гордон, ты спас мой день ... –

Смежные вопросы