2017-04-18 38 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