mysql если совпадает весь список

181
23 апреля 2022, 22:00

Есть две таблицы. Нужно сделать выборку при условии что есть полное совпадение по ключам.

Таблица постов(posts)

id  object_id  title
1       10     name1
2       20     name2
3       30     name3
4       40     name4

Таблица категорий(category)

id  post_id  category
1      1        car
2      1        bed
3      1        bird
4      2        car
5      3        car
6      3        bed
7      3        home
8      4        car
9      4        home

При условии category = car, bed нужно получить только пост с id 1 и 3

UPDATE (скопировано из комментария)

"VERSION()": "5.6.36-1~dotdeb+7.1" – Дмитрий Бабанин

Answer 1
WITH
cte1 AS ( SELECT post_id, GROUP_CONCAT(DISTINCT category ORDER BY category) cat_list
          FROM category
          GROUP BY post_id
          HAVING SUM(category = 'car') ),
cte2 AS ( SELECT cat_list
          FROM cte1
          GROUP BY cat_list
          HAVING COUNT(cat_list) > 1 )
SELECT post_id, cat_list
FROM cte1
JOIN cte2 USING (cat_list)
ORDER BY 2,1;

fiddle

Для версии 5.x это будет выглядеть так:

SELECT post_id, cat_list
FROM ( SELECT post_id, GROUP_CONCAT(DISTINCT category ORDER BY category) cat_list
       FROM category
       GROUP BY post_id
       HAVING SUM(category = 'car') ) cte1
JOIN ( SELECT cat_list
       FROM ( SELECT post_id, GROUP_CONCAT(DISTINCT category ORDER BY category) cat_list
              FROM category
              GROUP BY post_id
              HAVING SUM(category = 'car') ) cte1
       GROUP BY cat_list
       HAVING COUNT(cat_list) > 1 ) cte2 USING (cat_list)
ORDER BY 2,1;

fiddle

Если нужно - добавьте в источник данных внешнего запроса и таблицу posts, соответствующим образом откорректировав список полей вывода.

Answer 2

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

SELECT posts.*  
FROM posts 
JOIN categories ON categories.post_id = posts.id 
WHERE categories.category IN ("car","bed") 
LIMIT 1
READ ALSO
Несколько Join таблицы саму на себя

Несколько Join таблицы саму на себя

Существует 3 таблицыТаблица product

164
Оператор GROUP BY feild ASC не работает на MySQL 8

Оператор GROUP BY feild ASC не работает на MySQL 8

Сайт стал большим и пришлось переезжать с хостинга на vps

191
Как найти подстроку через CrudRepository

Как найти подстроку через CrudRepository

Необходимо написать метод, который ищет содержание заданной подстроки в полеЕсли использовать просто findByContent (к примеру) то ищется полное...

210