Удивительно, но подвыбор является достаточно эффективным способом сделать это на MySQL. Итак:
SELECT UserId
FROM Users
WHERE UserId NOT IN (
SELECT DISTINCT UserID
FROM Events
WHERE Status = TRUE
)
Обратите внимание, что я использую DISTINCT
там, что может не подходить для указанной статьи. Имейте в виду, что вы можете быть в порядке с DISTINCT
или с его отключением (но я не знаю, приведет ли это к проблемному промежуточному набору данных, или MySQL умен).
Или вы можете сделать версию LEFT JOIN / IS NULL, которая не имеет проблемы DISTINCT
:
SELECT Users.UserId
FROM Users
LEFT JOIN Events
ON Events.UserId = Users.UserId AND Events.Status = TRUE
WHERE Events.UserId IS NULL
См. Ссылку выше для обсуждения, но MySQL обеспечивает в основном одинаковую производительность в обоих случаях (тогда как использование NOT EXISTS
вместо NOT IN
было бы заметно менее эффективным).
Я бы попробовал оба (или все три, если вы попробуете как с, так и без DISTINCT
на первом) и посмотрел бы, что лучше всего работает с вашими реальными данными.