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