The data says that you need CREATE TABLE Seen ( user_id ..., item_id ..., PRIMARY KEY(user_id, item_id), INDEX (item_id, user_id) ) ENGINE=InnoDB; That is in addition to table `Users`, with `PRIMARY KEY(user_id)` and `Items` with pk `(item_id)`. Items not seen by user 1234: SELECT i.item_id FROM Items AS i LEFT JOIN Seen AS s ON s.item_id = i.item_id WHERE s.item_id IS NULL AND s.user_id = 1234; You could then `JOIN` to `Users` and/or `Items` to get more info. Separate tables for separate users -- _NO_. This is a common question with the same answer every time.