O
O
olezko462015-01-23 15:25:48
PHP
olezko46, 2015-01-23 15:25:48

How to properly parse the data?

Let's say I have the following website:
da2a12059cfd4e7b870b57bab40ee26b.jpg
Where:

  • 1 - rotator, which includes the last four articles from the entire site (from any category)
  • 2,3,4,5,6,7 - small informers that display N amount of latest news from each category on the site

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

Answer the question

In order to leave comments, you need to log in

2 answer(s)
Вячеслав, 2015-01-23
@olezko46

Я не большой специалист по базам данных, но, кажется, реализация сильно зависит от количества новостей, которое вы предвидите.
Если их будет мало (до 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 :) )

Евгений, 2015-01-23
@Nc_Soft

Берете redis, при добавлении статьи пихаете ее ид в list нужной категории, в котором храните последних 10 или сколько там вам надо
redis.io/commands/lpush добавлять
redis.io/commands/ltrim чистить лишнее
redis.io/commands/lrange выбирать
Тоесть будет несколько списков с названиями latest:category:1, latest:category:2 итд
Потом просто выбираете по n идишников из нужных и тасуете как хотите, можете чекать дубли итп.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question