如何获取相同值的有限记录

时间:2015-04-30 13:23:59

标签: mysql

我有一个表media,其中我有idimage_pathuploaded_date字段。

我的媒体表数据。

id | image_path             | uploaded_date 
---+------------------------+--------------
324   /media/job/plumber.jpeg  2015-04-20
323   /media/job/plumbe1.jpeg  2015-04-20
322   /media/job/plumbe2.jpeg  2015-04-20
321   /media/job/plumbe2.jpeg  2015-04-20
320   /media/job/plumbe2.jpeg  2015-04-17
319   /media/job/plumbe2.jpeg  2015-04-17
318  /media/job/plumbe2.jpeg  2015-04-14
317   /media/job/plumbe2.jpeg  2015-04-09
316   /media/job/plumbe2.jpeg  2015-04-09
315   /media/job/plumbe2.jpeg  2015-04-03
314   /media/job/plumbe2.jpeg  2015-04-03
313   /media/job/plumbe2.jpeg  2015-04-03
312  /media/job/plumbe2.jpeg   2015-04-03
310   /media/job/plumbe2.jpeg  2015-04-02
309   /media/job/plumbe2.jpeg  2015-04-02
308   /media/job/plumbe2.jpeg  2015-04-02

依旧......

我使用以下查询:

SELECT (SELECT COUNT(distinct u2.`uploaded_date`) FROM media u2
WHERE 
u2.`uploaded_date` > u1.`uploaded_date`) + 1 AS week, `uploaded_date`,`id` FROM media u1
ordeR BY week 

我得到的结果如下。

week | uploaded_date | id
-----+---------------+----
1   2015-04-20        324   
1   2015-04-20        323   
1   2015-04-20        322   
1   2015-04-20        321   
2   2015-04-17        319   
2   2015-04-17        320   
3   2015-04-14        318   
4   2015-04-09        316   
4   2015-04-09        317   
5   2015-04-03        312   
5   2015-04-03        314   
5   2015-04-03        315   
5   2015-04-03        313   
6   2015-04-02        308   
6   2015-04-02        309   
6   2015-04-02        310   
6   2015-04-02        311   

现在我想要的是我只想获取本周的前两个记录。

所需的输出如下:

    week | uploaded_date | id
    -----+---------------+----
    1   2015-04-20        324   
    1   2015-04-20        323   
    2   2015-04-17        319   
    2   2015-04-17        320   
    3   2015-04-14        318   
    4   2015-04-09        316   
    4   2015-04-09        317   
    5   2015-04-03        312   
    5   2015-04-03        314   
    6   2015-04-02        308   
    6   2015-04-02        309   

任何人都可以帮助我吗?我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

这是一个非常好的article关于获得最大的每组人数,这是你在这里尝试做的。网站上还有一个tag

当我这样做时,我最常见的方法是通过在where子句中添加子查询来使用相关子查询,该子查询对项目进行排序,并确保其计数小于或等于您想要的数量。

在这种情况下,我们希望按id按降序排序项目week,并确保返回的项目数小于2,因此我们可以这样做:

SELECT m.*
FROM myTable m
WHERE(
  SELECT COUNT(*)
  FROM myTable mT
  WHERE m.week = mT.week AND m.upload_date = mT.upload_date AND m.id <= mT.id) <= 2;

这是一个SQL Fiddle示例。请注意,这假设您想要的两行是每周最大的两个id,因为这是您的大多数预期结果所表明的。如果那不是您想要的,请告诉我,我可以进行相应的编辑。

修改

由于'周'实际上并不是您表格的一部分,只需将其从上面的查询中移除,它仍然可以使用:

SELECT m.*
FROM myTable m
WHERE(
  SELECT COUNT(*)
  FROM myTable mT
  WHERE m.upload_date = mT.upload_date AND m.id <= mT.id) <= 2;

以下是更新的fiddle链接。

答案 1 :(得分:0)

您还可以使用LEFT JOINGROUP BY

获得相同的结果
   SELECT m.week, m.upload_date, m.id
     FROM myTable m
LEFT JOIN myTable mj
       ON mj.week = m.week
      AND mj.upload_date = m.upload_date
      AND mj.id > m.id
 GROUP BY m.week, m.upload_date, m.id
   HAVING COUNT(*) < 2
 ORDER BY week, id DESC

N.B。我这只能用于每组2行或更多行

答案 2 :(得分:0)

在这里,我得到了我想要的输出。

我使用以下查询。

SELECT WEEK( m.uploaded_date ) , DATE_ADD( m.uploaded_date, INTERVAL( 1 - DAYOFWEEK( m.uploaded_date ) ) 
DAY ) as start_date, DATE_ADD( m.uploaded_date, INTERVAL( 7 - DAYOFWEEK( m.uploaded_date ) ) 
DAY ) as end_date, m.uploaded_date, m.image_path
FROM media m
WHERE (

SELECT COUNT( * ) 
FROM media mT
WHERE WEEK( m.uploaded_date ) = WEEK( mT.uploaded_date ) 
AND m.id <= mT.id
) <=2
ORDER BY WEEK( m.uploaded_date )

我的输出:

week | start_date  | end_date | uploaded_date 
7      2015-02-15   2015-02-21  2015-02-19  
7      2015-02-15   2015-02-21  2015-02-19  
8      2015-02-22   2015-02-28  2015-02-26  
8      2015-02-22   2015-02-28  2015-02-26  
9      2015-03-01   2015-03-07  2015-03-04  
9      2015-03-01   2015-03-07  2015-03-04
10     2015-03-08   2015-03-14  2015-03-12  
10     2015-03-08   2015-03-14  2015-03-12  
11     2015-03-15   2015-03-21  2015-03-20  
11     2015-03-15   2015-03-21  2015-03-20  

如您所见,我从uploaded_date获取开始日期和结束日期。从周的开始日期和结束日期开始,我每周只获得两条记录。总之,我每周都会得到两条记录。如果一周有两个以上的记录,这仍然会给我两个记录。

感谢。 希望这会对其他人有所帮助。