Есть две таблицы. Нужно сделать выборку при условии что есть полное совпадение по ключам.
Таблица постов(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" – Дмитрий Бабанин
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
, соответствующим образом откорректировав список полей вывода.
Если необходимо получить только первое совпадение, можно использовать LIMIT
SELECT posts.*
FROM posts
JOIN categories ON categories.post_id = posts.id
WHERE categories.category IN ("car","bed")
LIMIT 1
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Сайт стал большим и пришлось переезжать с хостинга на vps
Необходимо написать метод, который ищет содержание заданной подстроки в полеЕсли использовать просто findByContent (к примеру) то ищется полное...