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.