@WhiteFoxX

Как в текущую строку mysql вставить значения из последующих строк? Зациклить новости по id?

Есть 1000 строк в таблице mysql с news_id и rel_id. News_id имеет значение, в rel_id пусто. Как с помощью php вставить в rel_id 5 последующих news_id. Т.е в строке с news_id = 1 rel_id будет 3,4,5,6,7 и чтобы в строке news_id = 1000 rel_id были следующие 5 т.е rel_id = 1,2,3,4,5. По сути надо зациклить новости. Извиняюсь если путанно объяснила.
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Не надо ничего хранить - у вас все данные для такого вывода уже есть. Один простой запрос
select * from news order by (id > ИД_ТЕКУЩЕЙ НОВОСТИ) desc, id limit 5;

сделает вам ровно то что вы хотите - 5 следующих новостей, у самой последней новости выведет 5 первых.

З.Ы. Но и это решение так себе.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Если вы делали механизм связывания похожих новостей (в ручном режиме указания связей), то с точки зрения реляционной теории баз данных хранение связей реализовано не корректно.
Сложно использовать атрибут rel_id, когда в него записывают несколько значений через запятую.
Вместо данного атрибута нужно создать отдельную таблицу для хранения связей:
news_relation - таблица связей похожих новостей:
атрибуты:
id - идент. связи (первичный ключ)
news_id_1 - идент. новости (первый конец ребра связи, внешний ключ, создайте индекс)
news_id_2 - идент. новости (второй конец ребра связи, внешний ключ, создайте индекс)
Для новости, с id = 1 таблица будет заполнена так:
id, news_id_1, news_id_2
1, 1, 3
2, 1, 4
3, 1, 5
4, 1, 6
5, 1, 7
Если ребра связей равнозначны (неориентированный граф), то достаточно иметь запись, подтверждающую связь от news_id_1 к news_id_2. Например, у вас есть запись связи 3, 1, 5 - связь от новости 1 к новости 5, то не нужно создавать еще одну запись вида 6, 5, 1 - связь от новости 5 к новости 1. При создании и редактировании новости отслеживайте этот момент - не допускайте создание повторных связей в другом направлении (иначе придется использовать distinct в запросе ниже, он будет работать медленнее). Эту неориентированность можно реализовать текстом запроса, не записывая дополнительных данных в таблицу (обратите внимание на условие с or в запросе).
Запрос для получения связанных новостей будет такой:
select n.*
from news as n
join news_relation as nr on (:id = nr.news_id_1 and n.id = nr.news_id_2) -- выявляем связь в одну сторону
                         or (:id = nr.news_id_2 and n.id = nr.news_id_1) -- выявляем связь в другую сторону
order by n.id desc

:id - входной параметр текущей новости
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 14:10
500 руб./за проект
19 апр. 2024, в 13:31
10000 руб./за проект