我有一个表media
,其中我有id
,image_path
和uploaded_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
任何人都可以帮助我吗?我怎样才能做到这一点?
答案 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 JOIN
和GROUP 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获取开始日期和结束日期。从周的开始日期和结束日期开始,我每周只获得两条记录。总之,我每周都会得到两条记录。如果一周有两个以上的记录,这仍然会给我两个记录。
感谢。 希望这会对其他人有所帮助。