Telegram Group & Telegram Channel
🧠 SQL-задача с подвохом: “Самый активный — или самый невидимый?”

📘 Условие

У тебя есть две таблицы:


users(id, name)
posts(id, user_id, title)


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

📌 Но — в одном запросе.

Попробуй решить задачу таким SQL:


SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0 OR COUNT(p.id) = (
SELECT MAX(cnt)
FROM (
SELECT COUNT(*) AS cnt
FROM posts
GROUP BY user_id
) t
);


🔍 Вопрос:

1) Почему он может вернуть неправильный результат?
2) В чём разница между COUNT(*) и COUNT(p.id)?
3) Как переписать его правильно?

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

💣 Подвох 1: COUNT(p.id) пропускает NULL

Когда ты делаешь LEFT JOIN, для пользователей без постов p.id = NULL.

COUNT(*) считает все строки (включая NULL)
COUNT(p.id) не считает строки, где p.id IS NULL

👉 Это может привести к тому, что:
COUNT(p.id) = 0 — действительно "нет постов"
• но в подзапросе SELECT COUNT(*) считает иначе и даёт искаженную MAX(cnt)

🔁 Как правильно:

1) Подзапрос должен использовать COUNT(p.id), чтобы сравнение было честным
2) Либо использовать JOIN вместо LEFT JOIN в подзапросе, чтобы не попасть на "нулевых" пользователей

Финальный корректный запрос:


SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0
OR COUNT(p.id) = (
SELECT MAX(cnt)
FROM (
SELECT user_id, COUNT(p.id) AS cnt
FROM posts
GROUP BY user_id
) AS ranked
);


🎯 Такой запрос честно покажет:

• Всех “молчунов” (0 постов)
• И самого активного автора (макс постов)

📌 Отлично подходит для собеседования или тех, кто считает, что "GROUP BY — это просто".
@sqlhub



tg-me.com/sqlhub/1877
Create:
Last Update:

🧠 SQL-задача с подвохом: “Самый активный — или самый невидимый?”

📘 Условие

У тебя есть две таблицы:


users(id, name)
posts(id, user_id, title)


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

📌 Но — в одном запросе.

Попробуй решить задачу таким SQL:


SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0 OR COUNT(p.id) = (
SELECT MAX(cnt)
FROM (
SELECT COUNT(*) AS cnt
FROM posts
GROUP BY user_id
) t
);


🔍 Вопрос:

1) Почему он может вернуть неправильный результат?
2) В чём разница между COUNT(*) и COUNT(p.id)?
3) Как переписать его правильно?

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

💣 Подвох 1: COUNT(p.id) пропускает NULL

Когда ты делаешь LEFT JOIN, для пользователей без постов p.id = NULL.

COUNT(*) считает все строки (включая NULL)
COUNT(p.id) не считает строки, где p.id IS NULL

👉 Это может привести к тому, что:
COUNT(p.id) = 0 — действительно "нет постов"
• но в подзапросе SELECT COUNT(*) считает иначе и даёт искаженную MAX(cnt)

🔁 Как правильно:

1) Подзапрос должен использовать COUNT(p.id), чтобы сравнение было честным
2) Либо использовать JOIN вместо LEFT JOIN в подзапросе, чтобы не попасть на "нулевых" пользователей

Финальный корректный запрос:


SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.name
HAVING COUNT(p.id) = 0
OR COUNT(p.id) = (
SELECT MAX(cnt)
FROM (
SELECT user_id, COUNT(p.id) AS cnt
FROM posts
GROUP BY user_id
) AS ranked
);


🎯 Такой запрос честно покажет:

• Всех “молчунов” (0 постов)
• И самого активного автора (макс постов)

📌 Отлично подходит для собеседования или тех, кто считает, что "GROUP BY — это просто".
@sqlhub

BY Data Science. SQL hub


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/sqlhub/1877

View MORE
Open in Telegram


Data Science SQL hub Telegram | DID YOU KNOW?

Date: |

Should You Buy Bitcoin?

In general, many financial experts support their clients’ desire to buy cryptocurrency, but they don’t recommend it unless clients express interest. “The biggest concern for us is if someone wants to invest in crypto and the investment they choose doesn’t do well, and then all of a sudden they can’t send their kids to college,” says Ian Harvey, a certified financial planner (CFP) in New York City. “Then it wasn’t worth the risk.” The speculative nature of cryptocurrency leads some planners to recommend it for clients’ “side” investments. “Some call it a Vegas account,” says Scott Hammel, a CFP in Dallas. “Let’s keep this away from our real long-term perspective, make sure it doesn’t become too large a portion of your portfolio.” In a very real sense, Bitcoin is like a single stock, and advisors wouldn’t recommend putting a sizable part of your portfolio into any one company. At most, planners suggest putting no more than 1% to 10% into Bitcoin if you’re passionate about it. “If it was one stock, you would never allocate any significant portion of your portfolio to it,” Hammel says.

In many cases, the content resembled that of the marketplaces found on the dark web, a group of hidden websites that are popular among hackers and accessed using specific anonymising software.“We have recently been witnessing a 100 per cent-plus rise in Telegram usage by cybercriminals,” said Tal Samra, cyber threat analyst at Cyberint.The rise in nefarious activity comes as users flocked to the encrypted chat app earlier this year after changes to the privacy policy of Facebook-owned rival WhatsApp prompted many to seek out alternatives.Data Science SQL hub from tw


Telegram Data Science. SQL hub
FROM USA