Хорошо, после многих исследований я понял, что это мое собственное незнание терминологии SQL, которая удерживала меня. Мой поиск решения для поиска пользователей, принадлежащих к «хотя бы одному из» списка групп, должен был найти пользователей, принадлежащих к «любому» из списка групп. Функция any
ORM от SQLAlchemy делает именно то, что мне нужно, например:
session.query(ZKUser).filter(ZKUser.groups.any(ZKGroup.id.in_([1,2,3])))
Этот код испускает этот SQL (в MySQL 5.1):
SELECT * FROM users
WHERE EXISTS (
SELECT 1 FROM user_groups, groups
WHERE users.id = user_groups.contact_id
AND groups.id = user_groups.group_id
AND groups.id IN (%s, %s, %s)
)