限制每列最多两行值

时间:2015-05-30 17:14:59

标签: mysql sql

mysql中是否有办法调整此查询:

bserver_thread

这样每个产品最多只出现两次?

select * from table order by date desc limit 4

应该返回的查询:

date | product | description  
2015 | a | alpha  
2012 | a | bravo  
2014 | a | charlie  
2011 | b | delta  
2000 | c | echo  
1999 | d | foxtrot
1972 | d | g...  

而不是

2015 | a | alpha  
2014 | a | charlie  
2011 | b | delta  
2000 | c | echo  

1 个答案:

答案 0 :(得分:1)

您可以运行如下查询:

Select thedate, product, description
From (
  Select t.*
  , (@r:=Case when @p=t.Product then @r+1 else 1 end) as rownumber
  , (@p:=t.Product) as theProduct
  From (Select * From thetable order by product, thedate desc) t,
       (Select @r:=0,@p:='') r
) q
Where rownumber <= 2

(请注意,我使用thedate作为我的列名,使用thetable作为我的表名,以避免必须转义其名称。

Select @r:=0,@p:=''加入查询以创建两个变量:@r用于存储行号,@ p用于存储最后一个产品。如果产品与最后一行相同,我们会增加行号,否则我们将其重置为1.

这模拟了在SQL Server中可用但不在MySQL中的分区功能的row_number()。它为每个组中的每一行分配一个数字(其中一个组是产品的行集),然后WHERE子句限制结果,以便只显示每个组的前两个行号。