У меня есть 3 таблицы в моей базе данных: Categories
, Category_relationships
и Article
.
Category_relationships
похоже
id | category | article
---+----------+--------
1 | 2 | 3
2 | 4 | 3
Im получает URL-адрес: filter.php?category[]=2&category[]=4
Я хочу перечислить статью 3 с одним SQL-запросом.
Как я могу это сделать?
И извините за мой английский :)
Для получения желаемых результатов может быть несколько подходов. Следующие запросы основаны на том, чтобы соответствовать, если статья имеет эти две категории, если есть 3 категории, и вам нужно применять соответствующие критерии 3 раза с разными идентификаторами категории для каждого соответствия
Использование агрегации
select a.id, a.name
from article a
join category_relationships cr on a.id = cr.article_id
join category c on c.id = cr.category_id
group by a.id, a.name
having count(case when c.id = 2 then 1 else null) > 0
and count(case when c.id = 4 then 1 else null) > 0
или же
select a.id, a.name
from article a
join category_relationships cr on a.id = cr.article_id
join category c on c.id = cr.category_id
where c.id in(2,4)
group by a.id, a.name
having count(c.id) = 2
Здесь 2 является переменной, зависит от того, сколько категорий должно совпадать. Также, если есть вероятность дублирования, например, есть несколько записей в одной статье с одинаковым идентификатором категории, то используйте счетчик (отчетный c.id) = 2
Использование EXISTS
select a.id, a.name
from article a
where exists(
select 1
from category_relationships
where a.id = article_id
and category_id = 2
) and exists(
select 1
from category_relationships
where a.id = article_id
and category_id = 4
)