Задать вопрос
konnn
@konnn
Front-end developer

Сложный MySQL запрос?

Привет всем!
Заранее прошу прощения за такой нагловатый, я бы сказал вопрос)))

На сайте пользователи добавляют друг друга в друзья!
Есть таблица где это всё фиксируется, но я никак не соображу как правильно составить mysql запрос к бд.

Таблица friends
cb91f25fb3264189bf50fc486d595bf5.jpg

Суть в том, что надо вывести три блока где будет показано:
1. ДРУЗЬЯ (это те кто добавил друг друга в друзья)
2. ПОДПИСАН (это те кого я добавил в друзья)
3. ПОДПИСЧИКИ (это те кто меня добавил в друзья)

У меня не получается составить первый запрос! Думаю... Это надо выбрать всех пользователей которых я добавил в друзья, и потом проверить добавили ли они меня в друзья, вот здесь я никак просто не пойму как сделать запрос!
Подскажите пожалуйста, кто в этом неплохо разбирается или хорошо)) как сделать запрос?

Заранее спасибо!
Может кто кинет ссылку где говориться о подобном)
Тоже спасибо!
  • Вопрос задан
  • 968 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
С точки зрения производительности при больших объемах данных - самое правильное это для первого запроса держать отдельную табличку по типу Вашей, но добавлять туда данные только если дружба взаимная.
Обновлять её соответственно при добавлении-удалении дружбы.
Ответ написан
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Во-первых, вам не нужны айдишники в таблице дружбы (хотя у вас это таблица подписок, если правильнее выражаться).
Во-вторых, вам нужно использовать JOIN
-- Подписки
select u.id, u.name 
from t_users me
left join t_users_friends uf on uf.user_id = me.id
left join t_users u on u.id = uf.friend_id
where me.id = 1;
-- Подписчики
select u.id, u.name 
from t_users me
left join t_users_friends uf on uf.friend_id = me.id
left join t_users u on u.id = uf.user_id 
where me.id = 1;
-- Взаимные подписки (друзья, тяжело)
select u.id, u.name
	from t_users me
	left join t_users_friends uf on uf.user_id = me.id
	left join t_users u on u.id = uf.friend_id
	where me.id = 1
	and u.id in (
		select u2.id
		from t_users u2
		inner join t_users_friends uf2 on uf2.user_id = u2.id
		where uf2.friend_id = me.id
	);

Дружба же - это перекрёстная подписка и она действительно может работать тяжело и вариантом оптимизации является предложенный выше Дмитрий Энтелис вариант.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `t1`.`friendid`
    FROM `friends` AS `t1`
    JOIN `friends` AS `t2` ON `t2`.`userid` = `t1`.`friendid`
        AND `t2`.`friendid` = `t1`.`userid`
    WHERE `t1`.`userid` = :myId

А поле `id` в этой таблице без надобности, пара (`userid`, `friendid`) должна сама образовывать первичный ключ.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы