I have 4 tables:
Table user with id, email, first_name, last_name, country, activated
Table assets with id, serial, model_id, assigned_to
Table models with id, name, category_id
Table categories with id, name
Table status_labels with id, name
& I want to know active people that have no headset, I tested a query but returns me nothing, because a user can have a laptop or desktop and monitor, etc. which means assets should not be null
Here is my query:
SELECT u.id, u.email, u.first_name, u.last_name
FROM users u
WHERE u.activated = 1 AND u.country = 'MA' AND u.id NOT IN (
SELECT assigned_to
FROM assets a
INNER JOIN models m ON a.model_id = m.id
INNER JOIN categories c ON m.category_id = c.id
WHERE c.name = 'Desktop'
)
Here is another one: it returns also nothing
SELECT u.id, u.email, u.first_name, u.last_name
FROM users u
LEFT JOIN assets a ON a.assigned_to = u.id
LEFT JOIN models m ON m.id = a.model_id
LEFT JOIN categories c ON c.id = m.category_id
WHERE u.activated = 1 AND u.country = 'MA' AND c.name = 'Headset' AND a.id IS NULL;
I’m expecting values in return
2
Answers
You could aggregate by user and then assert that the headset count be zero:
The condition
c.name = 'Headset'
should be moved to theON
clause so that the users without headsets are not filtered out and the conditiona.id IS NULL
should be changed toc.id IS NULL
because the tablecategories
is the one you should check for a non-match: