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:

  1. imageid1 has lower rank imageid2 next highest rank less imageid2
  2. matchups table doesn't have (userid,imageid1,imageid2) or (userid,imageid2,imageid1)
  3. 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

Popular posts from this blog

c++ - Is it possible to compile a VST on linux? -

java - Output of Eclipse is rubbish -

jquery - Confused with JSON data and normal data in Django ajax request -