Basically i have this kind of database:
user: id username password name surname photo: id url upvotes user_id(foreign_key) pair: id user_id(foreign_key) photo1_id(foreign_key) photo2_id(foreign_key)
My application is kind of photo contest where users uploading their photos and choose the one they like. User can only make a choice between two random photo but with one condition – pairs can not be repeated for that user.
So i made a table where i collect all pairs that users already seen but i do not know how to effectively SELECT two random rows of photo table with condition that they are not in pair table.
Maybe i should restructure my database for that task but i cant think of how to do it.
Advertisement
Answer
This is not necessarily efficient, but you can do:
select p1.id, p2.id
from photos p1 cross join
     photos p2 left join
     pairs pp
     on pp.user_id = ? and
        pp.photo1_id = p1.id and
        pp.photo2_id = p2.id
where pp.photo1_id is null
order by rand()
limit 1;
In practice, you might find it faster to generate a random pair and just check if it exists. Unless a user has compared a significant proportion of the pairs, you will only have to do this a handful of times.