mysql - SQL: query with complex subqueries -
i have following tables in game's database:
rankedup (image_id, user_id, created_at) globalrank (image_id, rank ) matchups (user_id, image_id1, image_id2) all image_ids in globalrank table assigned rank float 0 1
assuming have current logged in user's "user_id" value, i'm looking query return pair of image ids (imageid1, imageid2) such that:
- imageid1 has lower rank imageid2 next highest rank less imageid2
- matchups table doesn't have (userid,imageid1,imageid2) or (userid,imageid2,imageid1)
- rankedup table doesn't have (userid,imageid1) or if does, createdat column older x hours
what have far requirement 1 this:
select lowerimages.image_id lower_image, higherimages.image_id higher_image global_rank lowerimages, global_rank higherimages lowerimages.rank < higherimages.rank , lowerimages.image_id = ( select image_id ( select image_id global_rank rank < higherimages.rank order rank desc limit 1 , 1 ) tmp ) but doesnt work because can't reference higherimages.rank in subquery.
does know how satisfy of requirements in 1 query?
thanks help
edit:
i have query don't know efficiency , need test correctness:
select lowerimages.image_id lower_image, max(higherimages.image_id) higher_image global_rank lowerimages, global_rank higherimages lowerimages.rank < higherimages.rank , 1 not in (select 1 ranked_up lowerimages.image_id = ranked_up.image_id , ranked_up.user_id = $user_id , ranked_up.created_at > date_sub(now(), interval 1 day)) , 1 not in ( select 1 matchups user_id = $userid , lower_image_id = lowerimages.image_id , higher_image_id = higherimages.image_id union select 1 matchups user_id = $user_id , lower_image_id = higherimages.image_id , higher_image_id = lowerimages.image_id ) group 1 the "not in" statements i'm using indexed should run fast. efficiency problem have group , selection of global_rank tables
this question revision of pretty complex sql query, should no longer answered.
select ( select image_id, rank rankedup inner join globalrank on rankedup.image_id = globalrank .image_id user_id = xxx limit 1, 1 ) highest, ( select image_id, rank rankedup inner join globalrank on rankedup.image_id = globalrank .image_id user_id = xxx limit 2, 1 ) secondhighest i use sql server, think translation mysql :)
Comments
Post a Comment