2017-04-18 24 views
1

我有一個表在MySQL -爲了通過特定條件

ABC (User, Login_time, City) 

,幷包含它的一些數據。

我想要的結果是排名前5的用戶表單諾伊達應該在結果集中排在最前面,其餘結果集應該按login_time排序。看到這裏的小提琴 -

http://www.sqlfiddle.com/#!9/88c203/9

create table abc (user varchar(20), login_time date, city varchar(20)); 

insert into abc values ('A', curdate(), 'Noida'), 
        ('B', '2017-04-16', 'Delhi'), 
        ('C', '2017-04-14', 'Noida'), 
        ('D', '2017-04-18', 'Kanpur'), 
        ('E', '2017-04-13', 'Raebareli'), 
        ('F', '2017-04-16', 'Sitapur'), 
        ('G', '2017-04-17', 'Muradabad'), 
        ('H', '2017-04-18', 'Noida'), 
        ('I', '2017-04-13', 'Lucknow'), 
        ('J', '2017-04-12', 'Noida'); 

預期的結果是 -

'A', 2017-04-19, 'Noida' 
'C', '2017-04-14', 'Noida' 
'H', '2017-04-18', 'Noida' 
'D', '2017-04-18', 'Kanpur' 
'G', '2017-04-17', 'Muradabad' 
'B', '2017-04-16', 'Delhi' 
'F', '2017-04-16', 'Sitapur' 
'E', '2017-04-13', 'Raebareli' 
'I', '2017-04-13', 'Lucknow' 
'J', '2017-04-12', 'Noida' 

,我試圖查詢是 -

select * from (select user, login_time, city from abc 
where city = 'Noida' 
limit 3 
union all 
select user, login_time, city from abc 
where user not in (select user, login_time, city from abc 
where city = 'Noida' 
limit 3) 
limit 4, count) 
order by login_time 

當我嘗試執行查詢在小提琴它拋出錯誤 -

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery 

任何幫助將不勝感激。

+0

你的SQL小提琴時,我用它不起作用。把代碼放在你的問題中。此外,問題中的樣本數據和所需結果也會有所幫助。目前還不清楚「前五名」的含義。 –

回答

1

您可以使用括號將單獨排序的結果組合在一起。

(select user, login_time, city 
from abc 
where city = 'Noida' 
--order by login_time desc > add this to sort by login_time 
limit 5 
) 
union all 
(select user, login_time, city 
from abc 
where city <> 'Noida' 
order by login_time desc 
limit 3 
) 

因爲你必須包括非頂部從諾伊達5行的結果集,你可以使用一個left join獲得由login_time那些和秩序。

(select user, login_time, city 
from abc 
where city = 'Noida' 
order by login_time desc 
limit 3 
) 
union all 
(select a1.user, a1.login_time, a1.city 
from abc a1 
left join (select user, login_time, city 
      from abc 
      where city = 'Noida' 
      order by login_time desc 
      limit 3) a2 --this derived table is the previous result-set of top n users from Noida 
on a1.user=a2.user and a1.city= a2.city 
where a2.user is null  
order by a1.login_time desc 
limit 7 
) 

使用準備好的語句來獲取除前3行以外的剩餘行數。

set @a= (select count(*) - 3 from abc); 

prepare stmt from 
'(select user, login_time, city 
    from abc 
    where city = ''Noida'' 
    order by login_time desc 
    limit 3) 
union all 
(select a1.user, a1.login_time, a1.city 
from abc a1 
left join (select user, login_time, city 
      from abc 
      where city = ''Noida'' 
      order by login_time desc 
      limit 3) a2 
on a1.user=a2.user and a1.city= a2.city 
where a2.user is null  
order by a1.login_time desc 
limit ? 
)'; 

execute stmt using @a; 
+0

諾伊達有超過5個記錄表。所以我想要在login_time desc中進行排序。前5名不應該再來 –

+1

我不明白。你所要求的預期結果似乎沒有被排序。 –

+0

我編輯了這個問題。在這裏,我以3條記錄爲例,諾伊達的3位用戶應該先到,休息結果不應包含這3條記錄,並按login_time排序。 –

0

如果你想從諾伊達用戶至上,只需使用:

select abc.* 
from abc 
order by (city = 'Noida') desc, 
     login_time desc; 
+0

但我怎麼會確保只有前3名記錄是諾伊達和其餘的將按login_time順序? BTW小提琴現在工作。 –

0

這將工作如果你確信你有3個紀錄,城市=「諾伊達」

select * 
from 
(
    (
     select user,login_timecity 
     from abc 
     where city='noida' 
     order by login_time 
     limit 3 
    ) 
    union 
    (
     select user,login_timecity 
     from abc 
     where x 
     order by city='noida' DESC, login_time 
     limit 3, x 
    ) 
) t 
+0

它表示未申報的變量'X' –

+0

@AnkitBajpai這是一個模板 – Peter

0

嘗試是這樣的:

select *, 1 as OrderHelp 
    from abc 
    where city = 'Noida' 
    limit 3 
union all 
select *, 2 as OrderHelp 
    from abc 
    where user not in (
     select user 
      from abc 
      where city = 'Noida' 
      limit 3 
    ) 
    order by OrderHelp, login_time desc