TGViewer
SQL и Анализ данных SQL и Анализ данных @databases_tg · 12.4K subscribers
Post #988 3.64K
🧠 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) Как обойти случай, если один и тот же друг записан несколько раз?

✅ Разбор подвоха

💣 Проблема: один пользователь может быть записан как друг **несколько раз**, особенно если приложение допускает дубли (или "перезапросы дружбы").

Пример:

```sql
INSERT INTO friends VALUES (1, 2), (1, 2), (1, 3);
```

В этом случае:

```sql
SELECT COUNT(friend_id) FROM friends WHERE user_id = 1;
-- → вернёт 3
```

Но реальных друзей у пользователя `1` — только **2**: `2` и `3`.

✅ Решение:

Используй `COUNT(DISTINCT friend_id)`:

```sql
SELECT user_id, COUNT(DISTINCT friend_id) AS unique_friends
FROM friends
GROUP BY user_id
ORDER BY unique_friends DESC
LIMIT 1;
```

🎯 Дополнительно можно убрать самого пользователя из списка друзей (на случай ошибок):

```sql
WHERE user_id != friend_id
```

⚠️ Подвох

• `COUNT()` без `DISTINCT` ловит даже опытных — особенно если в БД возможны дубли
• `LIMIT 1` не гарантирует "уникального победителя", если у нескольких одинаковый счёт
• Иногда friendship бывает и симметричной, тогда нужна защита от двойного счёта
  • 👀 11
  • 👍 9
  • ❤ 2
  • 🔥 2
  • 💊 1
More from @databases_tg
  1. Oct 2, 2026Как SQLite превращает числа в текст в 2 раза быстрее? Трюк с парами цифр Обычно число пере…
  2. Oct 2, 2026В субботу, 17 октября, Москва станет точкой притяжения для всех специалистов в области Rec…
  3. Oct 1, 2026Жиз
  4. Sep 30, 2026📝 5 уровней ИИ-агентов: от промпта до продакшена Context, loop, Jev, harness и evals: раз…
  5. Sep 26, 2026UPDATE — оператор обновления данных в MySQL 🗂️ Если в таблице нужно изменить значение в у…
  6. Sep 25, 2026🧠 SQL-задача с подвохом Есть таблица транзакций: CREATE TABLE transactions ( id int PRIMA…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →