Middle
20
Дополни запрос: вывести имя пользователя и количество приглашённых им людей (только тех, кто хоть кого-то пригласил).
Companies where asked
Answer from AI
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}")
Логика:
- Сначала соединяем пользователей с теми, кого они пригласили.
- Группируем по пользователю и считаем количество приглашённых.
- Фильтруем по условию, что пользователь должен быть пригласившим хотя бы одного человека, который сам пригласил кого-то (то есть вложенный фильтр по приглашениям).
Таким образом, выводятся только те пользователи, которые пригласили людей, и эти приглашённые тоже пригласили хотя бы кого-то.