嗨,我有这个分数表,在我的报告前端,我必须显示的关键字和url和分数为最新扫描。
创建表scores
(id
int(11)unsigned NOT NULL AUTO_INCREMENT,keyword
varchar(200)DEFAULT NULL,url
varchar(200)DEFAULT NULL,score
int(11)DEFAULT NULL,check_date
date DEFAULT NULL,主键(id
)))engine=innoDb
下面是我的示例数据:
样本数据
| id | keyword | url | score | check_date |
|----|----------|----------------------|-------|------------|
| 1 | facebook | https://facebook.com | 10 | 2020-10-21 |
| 2 | facebook | https://facebook.com | 30 | 2020-10-25 |
| 3 | fb | https://facebook.com | 55 | 2020-10-23 |
| 4 | fb | https://facebook.com | 20 | 2020-10-24 |
我的查询
select s1.* from scores s1
join scores s2 on s1.id = s2.id
where s1.check_date = s2.check_date
group by keyword,url
它为特定的关键字url返回正确的check_date,但score不是根据该日期。 请帮帮我。
不要为此使用聚合。 一个简单的方法是相关子查询:
select s.*
from scores s
where s.check_date = (select max(s2.check_date)
from scores s2
where s2.keyword = s.keyword and s2.url = s.url
);
如果您打算使用显式的联接
,则可以使用左联接
,查找更大的日期,并返回没有更大日期的行:
select s.*
from scores s left join
scores slater
on slater.keyword = s.keyword and
slater.url = s.url and
slater.check_date > s.check_date
where slater.check_date is null;
您已经按正确的内容进行了分组,您只需使用max aggregate函数对check_date进行操作
select max(check_date), score, url, keyword
from scores
group by url, keyword
我有一把小提琴你可以试一下
http://sqlfiddle.com/#!9/7 D0FBF/12