2013-05-28 4 views
0

Когда у меня есть таблица users:Mysqli запроса для подсчета количества общих друзей

id | login 
1 Mike 
2 Janet 
3 Bruce 

И у меня есть таблица дружбы под названием friendlist:

id | user | friend 
1 1  2 // Mike is friend with Janet 
2 2  1 // Janet accepted, created the friendship! 
3 1  3 // Mike is friend with Bruce 
4 3  1 // Bruce accepted! 

Теперь Майк друзья, Janet имеет , Bruce имеет .

Какой запрос выполнить, чтобы подсчитать количество таких друзей?

Это не домашнее задание. Я боролся с этим часами, не в силах это сделать.

Запрос, который работает для меня, но возвращает неверные результаты (больше друзей, чем на самом деле):

SELECT `users`.`id`, `login`, COUNT(`a`.`id`) 
FROM `users` 
LEFT JOIN(
    SELECT user AS `id` FROM `friendlist` 
    UNION ALL 
    SELECT friend  FROM `friendlist` 
) as `a` ON `a`.`id` = `users`.`id` 
GROUP BY `users`.`id` 

ответ

2

Учитывая свои комментарии ниже, пост, где друг должен быть запрошены, а затем обжаренные имеет принять, я обновил мой ответ:

SELECT U.Id, U.Login, COUNT(DISTINCT FL2.Id) 
FROM Users U 
    LEFT JOIN FriendList FL ON U.Id = FL.User 
    LEFT JOIN FriendList FL2 ON 
     FL.friend = FL2.user AND FL2.friend = U.Id 
GROUP BY U.Id 

Я включил использование DISTINCT в случае, если могут быть повторяющиеся строки - это может быть не так.

Кроме того, чтобы уточнить разницу между использованием COUNT(*) и COUNT(FL2.Id), это два разных оператора. Использование COUNT(*) приведет к отрицанию LEFT JOIN и возвращает все строки в качестве подсчета друзей.

0

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

1 DELIMITER ;; 
2 CREATE FUNCTION `Friendships`(k int) RETURNS int(11) 
3 BEGIN 
4 DECLARE user int; 
5 DECLARE friends int; 
6 SELECT count(*) from friendlist WHERE friendlist.user = k into user; 
7 SELECT count(*) from friendlist WHERE friendlist.friends = k into friends; 
8 RETURN user + friends; 
9 END ;; 
10 DELIMITER ; 

Таким образом, в конце концов, я бы назвал свою функцию и дать ему идентификатор (параметр) пользователя, который число дружбы, я хочу знать.

SELECT friendships(1); 

Из вашего примера результата будет 4.

Надеется, что это помогает.

Смежные вопросы