birdy90
@birdy90

Как сформировать ленту новостей/событий из нескольких таблиц (php/mysql)?

Добрый день!

Понимаю, что вопрос мало относится к указанным технологиям, но на всякий случай указал их.

Я пытаюсь сформировать ленту новостей. В эту ленту попадают новости, статьи, видео, репортажи. Каждый из этих типов данных лежит в отдельной таблице. Как минимум потому, что у них может немного различаться набор полей (основные совпадают), каждый из них имеет свою категоризацию.

Самое простое - выбрать всё через union, потом отсортировать и выбрать нужные:

select * from 
    (select * from news 
        union 
    select * from articles) as materials
order by time desc
limit <deisred_offset>, 10


Но в это варианте меня смущает, что таблицы довольно большие. Во-первых, выборка и сортировка будут занимать время, во-вторых offset, насколько мне известно, чем дальше от начала выборки - тем хуже

С другой стороны, мне не приходит в голову ничего более оптимального:
- так чтобы и по датам сортировалось предсказуемо (ведь новости могут публиковаться ежедневно по много раз, а статьи, например, раз в пару дней. Или вообще, одна из категорий давно не публиковалась. Это значит, что лимит на `select` до `union` повесить нельзя
- чтобы можно было сделать нормальный постраничный просмотр. Ориентироваться можно на идентификатор, но в данном случае идентификаторы пересекаются, и на них смотреть нельзя. А если по дате - то возвращаемся к предыдущему пункту - как выбирать данные, которые могут публиковаться очень часто, или не публиковаться годами

Есть ли какие-то руководства/практики построения таких конструкций?
  • Вопрос задан
  • 187 просмотров
Пригласить эксперта
Ответы на вопрос 2
@zhaar
select top 10 * from news1 order by postdate desc
union all
select top 10 * from articles1 order by postdate desc
union all
...

Это самый простой вариант.
Наверти сюда условия для выборки по каждым статьям (даты отсечки, автора и пр.) и будет щастье
Ответ написан
@Kirill-Gorelov
С ума с IT
Сделать на каждую таблицу отдельно по одному запросу.
Я думаю не стоит химичить с union.
Во-первых, ты можешь сделать свой запрос еще "тяжелее".
Во-вторых, я не думаю что у тебя там очень большая нагруженность, что тебе приходиться извращаться с объединением запросов.

Ну и последнее, раз на то пошло дело, то сделай по принципу "толстого клиента". На js делай запрос на получение последних новостей по отдельности, как пример.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы