Sobes.tech
Middle
19

Дополни запрос: вывести имя пользователя и количество приглашённых им людей (только тех, кто хоть кого-то пригласил).

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Предположим, у нас есть таблица пользователей с полями id, name и invited_by (id пользователя, который пригласил данного пользователя). Нужно вывести имя пользователя и количество приглашённых им людей, но только тех, кто сам пригласил хотя бы кого-то.

Пример на Python с использованием SQLAlchemy и SQLite:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, func
from sqlalchemy.orm import sessionmaker, declarative_base, aliased

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    invited_by = Column(Integer, ForeignKey('users.id'))

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

# Пример данных
users_data = [
    User(id=1, name='Alice', invited_by=None),
    User(id=2, name='Bob', invited_by=1),
    User(id=3, name='Charlie', invited_by=2),
    User(id=4, name='David', invited_by=2),
    User(id=5, name='Eve', invited_by=3),
    User(id=6, name='Frank', invited_by=None),
]
session.add_all(users_data)
session.commit()

# Алиас для подсчёта приглашённых
Invited = aliased(User)

# Запрос
result = session.query(
    User.name,
    func.count(Invited.id).label('invited_count')
).join(Invited, Invited.invited_by == User.id)
.group_by(User.id)
.having(
    session.query(User.id).filter(User.invited_by == User.id).exists()
)
.all()

for name, count in result:
    print(f"{name}: {count}")

Логика:

  • Сначала соединяем пользователей с теми, кого они пригласили.
  • Группируем по пользователю и считаем количество приглашённых.
  • Фильтруем по условию, что пользователь должен быть пригласившим хотя бы одного человека, который сам пригласил кого-то (то есть вложенный фильтр по приглашениям).

Таким образом, выводятся только те пользователи, которые пригласили людей, и эти приглашённые тоже пригласили хотя бы кого-то.