Установка условия для перекрестного соединения (sql)

0

Я хочу показать функцию общих друзей, но список моих друзей хранится на другой таблице.

Я хочу знать, можно ли использовать данные каждой строки в качестве предложения для соединения 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

Или я делаю это совершенно неправильно?

  • 4
    Добавьте некоторые примеры данных таблицы и ожидаемый результат. (Как форматированный текст, а не изображения.)
  • 0
    Обновил это спасибо.
Показать ещё 2 комментария
Теги:
join

1 ответ

1

Вот один из подходов.

С 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

Я попробую объяснить понемногу и, пожалуйста, исправьте меня, если есть ошибка.

  1. Условие a.friend_to = b.userid and b.friend_to = a.userid используется для выбора только общего друга. Тогда, если у пользователя есть такое "взаимное соединение", соответствующий userid появится один раз.
  2. Получите счетчик вместе с идентификатором пользователя.

  3. Слева присоединитесь к таблице 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.

С помощью CROSS JOIN SQL Fiddle

Без CROSS JOIN SQL Fiddle

Ещё вопросы

Сообщество Overcoder
Наверх
Меню