Лучший способ отобразить список элементов друзей, которые скрыты для всех остальных, в php / mysql

#php #mysql

#php #mysql

Вопрос:

У меня есть список элементов, которые показаны всем, если элемент помечен как статус = 1 При добавлении элементов, их статус также может быть равен 0, что означает, что они невидимы для всех, если вы не друзья с пользователем, который отправил элемент. Пары идентификаторов пользователя дружбы хранятся в другой таблице.

Таблица друзей состоит из 3 столбцов: friends_inviter, friends_accepter, friends_status (если friends_status = 1, они друзья). Пользователь (их ID), который инициирует дружбу, является приглашающим, пользователь, который принимает дружбу, является принимающим. Таким образом, идентификаторы ваших друзей могут отображаться в любом столбце.

В таблице элементов (для этого примера) также есть 3 столбца: item_id, item_status, item_owner

Каким был бы наилучший способ отобразить список элементов status = 1, а также элементов status = 0 пользователей, которые появляются в вашем списке друзей.

Ответ №1:

Мое предложение:

 SET @userID = 1; 

SELECT i.* 
FROM items i 
WHERE i.status = 1
OR  (
        i.status=0 
        AND 
        i.user_id IN ( 
            SELECT f.inviter_id FROM friends f WHERE f.accepter_id = @userID AND f.status = 1
            UNION
            SELECT f.accepter_id FROM friends f WHERE f.inviter_id = @userID AND f.status = 1
        ) 
)
  

[ ] Я не заметил вашу правку, но для этого в таблице вашего элемента также должен быть столбец, чтобы различать, кто добавил этот элемент

Комментарии:

1. Кажется, это работает, я просто не совсем уверен, насколько хорошо это будет масштабироваться с более чем миллионом строк в каждой таблице.

2. Вы можете попробовать использовать SELECT SQL_CACHE ... в подвыборках или переместить их в другой запрос и сначала выполнить его, чтобы получить массив, чем разбивать этот массив на комы, чтобы получить аргументы для IN()

Ответ №2:

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

 select i.* from friends f
join items i on
    (i.user_id = f.friends_inviter XOR i.user_id = f.friends_accepter)
where f.friends_status = 1
    and i.user_id != $current_user_id
  

Ответ №3:

Вы не указали структуру для таблицы элементов, так что это предположение

 SELECT * FROM item i 
LEFT JOIN friends f ON f.friends_status = 1 AND f.friends_inviter = i.userid 
WHERE i.status = 1 OR f.friends_status IS NOT NULL`