Я хочу показать функцию общих друзей, но список моих друзей хранится на другой таблице.
Я хочу знать, можно ли использовать данные каждой строки в качестве предложения для соединения B
SELECT * FROM ( SELECT * FROM 'users') a
CROSS JOIN (SELECT COUNT(*) AS MUTUAL_FRIENDS
FROM 'user_friends' WHERE 'friend_to' = 'a'.'userid') b
ORDER BY 'b'.'MUTUAL_FRIENDS' ASC
То, что я хочу сделать, это использовать идентификатор пользователя из таблицы users в качестве предложения для соединения с:
'friend_to' = 'a'.'userid'
Ожидаемые результаты:
+--------=+---------+-----------+--------------+
| userid | Username |Photo_URL |MUTUAL_FRIENDS|
+---------+---------+-----------+--------------+
1 Somename1 /image1.png 3
4 Somename4 /image4.png 2
2 Somename2 /image2.png 1
3 Somename3 /image3.png 0
5 Somename5 /image5.png 0
Таблица друзей:
+--------=+---------+-----------+
| friend_id | userid |friend_to |
+---------+---------+-----------+
1 1 2
2 2 1
3 1 3
4 3 1
5 1 4
6 4 1
Таблица пользователей
+--------=+---------+-----------+
| userid | Username |Photo_URL |
+---------+---------+-----------+
1 Somename1 /image1.png
2 Somename2 /image2.png
3 Somename3 /image3.png
4 Somename4 /image4.png
5 Somename5 /image5.png
Или я делаю это совершенно неправильно?
Вот один из подходов.
С CROSS JOIN
SELECT u.userid,u.Username,u.Photo_URL,IFNULL(Num,0) MUTUAL_FRIENDS
FROM Users u
LEFT JOIN (SELECT userid, COUNT(*) Num
FROM (SELECT a.userid
FROM Friends a
CROSS JOIN Friends b
WHERE a.userid = b.friend_to and a.friend_to = b.userid) r
GROUP BY userid) k ON u.userid = k.userid
ORDER BY MUTUAL_FRIENDS DESC, u.userid
Без CROSS JOIN
SELECT u.userid,u.Username,u.Photo_URL,IFNULL(Num,0) MUTUAL_FRIENDS
FROM Users u
LEFT JOIN (SELECT userid, COUNT(*) Num
FROM (SELECT a.userid
FROM Friends a, Friends b
WHERE a.friend_to = b.userid and b.friend_to = a.userid) r
GROUP BY userid) k ON u.userid = k.userid
ORDER BY MUTUAL_FRIENDS DESC, u.userid
Я попробую объяснить понемногу и, пожалуйста, исправьте меня, если есть ошибка.
a.friend_to = b.userid and b.friend_to = a.userid
используется для выбора только общего друга. Тогда, если у пользователя есть такое "взаимное соединение", соответствующий userid
появится один раз.Получите счетчик вместе с идентификатором пользователя.
Слева присоединитесь к таблице userid и count.
Результат
userid Username Photo_URL MUTUAL_FRIENDS
1 Somename1 /image1.png 3
2 Somename2 /image2.png 1
3 Somename3 /image3.png 1
4 Somename4 /image4.png 1
5 Somename5 /image5.png 0
Учитывая данные, user1 является общим другом user2, user3 и user4. User2 - это только общий друг пользователя 1 и пользователь 3 и user4.