@olezko46

Как правильно разобрать данные?

Допустим у меня есть следующий сайт:

da2a12059cfd4e7b870b57bab40ee26b.jpg

Где:
  • 1 - ротатор, в который попадают последние четыре статьи со всего сайта (из любой категории)
  • 2,3,4,5,6,7 - небольшие информеры, в которых выводятся по N количеству последних новостей из каждой категории на сайте


Вопрос таков: как правильно получить данные и "расфасовать по информерам"? При этом не должно быть, что если ротаторе (1) новость показывается, то не должна эта новость показываться в информере своей категории (2, 3, 4 и тд.).

Появилась нерациональная идея: делать для каждого информера и слайдера по запросу. В итоге получится, огромная нагрузка на базу, быдлокод и возможно дублирование одной новости на всей странице.

Вторая нерациональная идея: сделать один запрос к базе и получить большой массив данных из базы, сделать выборку и "расфасовать". Но при этом возможно, что в какой-то информер не попадет вообще ни одной статьи (вдруг на какую-то категорию забили, а в другую каждый день по 200 статей писали.

Собственно вопрос таков: как правильно получить данные и "расфасовать по информерам"? При этом не должно быть, что если ротаторе (1) новость показывается, то не должна эта новость показываться в информере своей категории (2, 3, 4 и тд.).

Заранее спасибо
  • Вопрос задан
  • 2349 просмотров
Решения вопроса 1
hedint
@hedint
Senior front-end developer
Я не большой специалист по базам данных, но, кажется, реализация сильно зависит от количества новостей, которое вы предвидите.
Если их будет мало (до 1-5 тысяч, скажем) то можно обойтись 2 запросами:
например, сначала выбрать новости для первого блока (ORDER BY date DESC LIMIT 4)
вторым запросом выбрать все новости ORDER BY date DESC (можно добавить WHERE id NOT IN(тут idшники из первого запроса))
создадим массив $blocks и вложенные массивы $blocks["$category_id"] = array(); (по количеству нужных нам блоков-категорий)
заполнить блоки:
n = 5;
foreach ($news as $news_item) {
	$category_id = $news_item['category_id'];
	foreach ($blocks as $block_category_id=>$block_news)
	{
		if ($category_id == $block_category_id && count($block_news) < n)
		{
			$block_news[] = $news_item;
			break;
		}
	}
}

(код не проверял, возможны ошибки-опечатки)
Но, я предполагаю, что на большой количестве новостей подобный подход даст существенную нагрузку, и, возможно, проще было бы сделать 6 простых SELECT WHERE category_id = :my_category_id LIMIT :n.

Советую все это проверить и не использовать как есть, попробовать разные варианты (ну или подождать ответ кого-нибудь, кто имеет лучший скилл в sql :) )
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Nc_Soft
Берете redis, при добавлении статьи пихаете ее ид в list нужной категории, в котором храните последних 10 или сколько там вам надо
redis.io/commands/lpush добавлять
redis.io/commands/ltrim чистить лишнее
redis.io/commands/lrange выбирать
Тоесть будет несколько списков с названиями latest:category:1, latest:category:2 итд
Потом просто выбираете по n идишников из нужных и тасуете как хотите, можете чекать дубли итп.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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