tgoop.com/sql_lib/290
Create:
Last Update:
Last Update:
🧠 SQL-задача с подвохом: “Найди самого активного… по количеству разных друзей”
📘 Условие
У тебя есть таблица дружбы:
friends(user_id, friend_id)
Здесь каждая строка означает, что
user_id
дружит с friend_id
. Записи всегда односторонние: если есть
(1, 2)
, это не значит, что будет (2, 1)
.Нужно написать запрос, который найдёт пользователя с наибольшим числом уникальных друзей.
❓ Пример попытки:
SELECT user_id, COUNT(friend_id) AS total_friends
FROM friends
GROUP BY user_id
ORDER BY total_friends DESC
LIMIT 1;
🔍 Вопрос:
1) В чём здесь может быть логическая ошибка?
2) Какую строку подсчитает
COUNT(friend_id)
? 3) Когда нужно использовать
COUNT(DISTINCT friend_id)
? 4) Как обойти случай, если один и тот же друг записан несколько раз?
✅ Разбор подвоха
💣 Проблема: один пользователь может быть записан как друг несколько раз, особенно если приложение допускает дубли (или "перезапросы дружбы").
Пример:
INSERT INTO friends VALUES (1, 2), (1, 2), (1, 3);
В этом случае:
SELECT COUNT(friend_id) FROM friends WHERE user_id = 1;
-- → вернёт 3
Но реальных друзей у пользователя
1
— только 2: 2
и 3
.✅ Решение:
Используй
COUNT(DISTINCT friend_id)
:
SELECT user_id, COUNT(DISTINCT friend_id) AS unique_friends
FROM friends
GROUP BY user_id
ORDER BY unique_friends DESC
LIMIT 1;
🎯 Дополнительно можно убрать самого пользователя из списка друзей (на случай ошибок):
WHERE user_id != friend_id
⚠️ Подвох
•
COUNT()
без DISTINCT
ловит даже опытных — особенно если в БД возможны дубли •
LIMIT 1
не гарантирует "уникального победителя", если у нескольких одинаковый счёт • Иногда friendship бывает и симметричной, тогда нужна защита от двойного счёта
BY Библиотека баз данных
Share with your friend now:
tgoop.com/sql_lib/290