@suppicq

Как вывести статьи из категорий?

Добрый день. Есть таблицы:

blog
id
name
text
date
status

category
id
name

categorylist
id
category_id
blog_id

В таблице categorylist связь статей с категориями. Одна статья может быть помещена в несколько категорий.
Как сделать выборку статей зная категорию в которой она находится.
Сначала я по id категории выбираю все id статей:

SELECT `blog_id` FROM `categorylist` WHERE `category_id` = 1


Получаю в список blog_id и потом делаю вывод статей:

SELECT * FROM `blog` WHERE `id`  IN (1,2,3,4,5,6,7,8,9)


Как еще можно сделать по другому? Если у меня будет больше 100 статей, не слишком трудоемкий процесс с IN?
  • Вопрос задан
  • 294 просмотра
Пригласить эксперта
Ответы на вопрос 2
@IceJOKER
Web/Android developer
Читайте про JOIN-ы
как-то так:
select b.* from blog b
join categorylist cl ON b.id = cl.blog_id
join category c ON c.id = cl.category_id
where ....
Ответ написан
Комментировать
nikitasius
@nikitasius
И так и по порядку:
Как сделать выборку статей зная категорию в которой она находится.


select b.* from 269816_blog b
where b.id in 
(select cl.blog_id from 269816_categorylist cl where cl.category_id=1);

Где 1 - это номер категории, который вы знаете.
Или
select b.* from 269816_blog b
where b.id in 
(select cl.blog_id from 269816_categorylist cl 
where cl.category_id=(select cat.id from 269816_category cat where cat.name=2001));

Где 2001 это имя категории (у меня в базе на скорую руку числовые значения присвоены), которое вы тоже знаете.

Так как выборка будет по primary ключам, то в вашей текущей задаче на скорости работы это ну никак не скажется.

Бонус
чтобы вывести все статьи из базы с указанием категорий, к которым они относятся, то можно использовать вот такой запрос:
select b.*, group_concat(c.id)
from 
269816_blog b,
269816_category c,
269816_categorylist cl
where cl.category_id=c.id
and cl.blog_id=b.id
group by b.id

Выбираем статьи, затем указываем связь между категориями, и затем привязываем категории к статьям. В итоге получает вот такое:
toster_269816_01_c66eed26ef57272f.png

Статья 1 у нас в 2х категориях:
toster_269816_02_39a95d0b73df4475.png

Если в запросе изменить group_concat(c.id) на group_concat(c.name), то результатом будут названия категорий.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы