#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`