Как выбрать из бд друзей и их друзей

186
13 августа 2021, 10:50

Имею систему добавления друзей на сайте, необходимо добавить в настройку аккаунта новый пункт в настройку кто может отправлять заявку в друзья. На данный момент есть только настройка ВСЕ и НИКТО необходимо добавить пункт ДРУЗЬЯ ДРУЗЕЙ. Значение которое настраивается в настройках профля помещается в таблицу setting где id_user равен моему айди и столбец friends = 3. Необходимо написать обработку на PHP которая переберёт всех друзей друзей и если есть значение в котором друг является моим другом то поставить в переменную $access = 'Y'. Сам код не обязательно писать, напишите примерное понимание как это можно реализовать. Спасибо.

Answer 1

Допустим у нас есть таблица friends с полями guy_id и friend_id, которая печесляет идентифиакторы всех друзей (friend_id) для конкретного пользователя (guy_id). Предполагается, что для каждой записи guy_id = A, friend_id = B существует запись guy_id = B, friend_id = A

Тогда в общем случае получение списка всех друзей и друзей друзей будет выглядеть как

select t.friend_id 
  from friends t 
  where t.guy_id = <guy_id>
union
select distinct f.friend_id 
  from friends t
    join friend f 
      on f.guy_id = t.friend_id
  where t.guy_id = <guy_id>

Но, мне кажется, задачу правильно ставить не то, как выбрать всех друзей друзей, а как именно реализовать проверку в момент когда кто-то кому-то собирается что-то написать.

... 
  case
    when exists (
      select * 
        from friends t 
        where t.guy_id = <кому_пишут_id>
           and (t.friend_id = <кто_пишет_id>
                or t.friend_id in ( 
                  select f.friend_id 
                    from friends f 
                    where f.guy_id = <кто_пишет_id>
                 )
               )
      ) 
    then <можно писать> 
    else <нельзя писать>
  end

В чём разница двух подходов: если в первом случае СУБД выбирет всех друзей, и затем для каждого друга выбирает список всех его друзей, затем устраняя дубликаты, то во втором случае СУБД выбирает только 2 списка: список друзей того, кто пишет, и список друзей того, кому пишут. Затем задача сводится к обнаружению существования пересечения этих списков, что является относительно дешёвой операцией.

READ ALSO
Убрать символы из строки php

Убрать символы из строки php

Всем привет, есть строка такого формата

157
Запретить изменение select. disabled не подходит

Запретить изменение select. disabled не подходит

Есть форма, там тег select, вот как запретить его редактирование не используя disabledПотому что этот disabled обходится очень просто

164
Woocommerce Кнопка &ldquo;в корзину&rdquo; возле каждой цены

Woocommerce Кнопка “в корзину” возле каждой цены

По умолчанию, если указывать несколько цен в Вариациях, то на странице товара они будут выводиться, как селектВыбираем нужную и в корзину

210
java.sql.SQLRecoverableException: Закрытое соединение: next

java.sql.SQLRecoverableException: Закрытое соединение: next

В коде в отдельном классе произвожу выборки и возвращаю ResultSet

271