如何查询具有最新日期的行并在第二个表上执行内部联接?

时间:2015-04-23 18:27:52

标签: mysql sql join

我见过的所有示例都显示了如何使用别名进行内部联接以获取具有最新日期的行。我可以用我的数据做到这一点,但我也想在另一个表上进行内部联接,但无法确定如何使用相同的查询。

以下是两个表格:

CREATE TABLE `titles` (
  `titleID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titlename` tinytext NOT NULL,
  `url` varchar(255) DEFAULT '',
  `category` int(2) unsigned NOT NULL,
  `postdate` date NOT NULL,
  PRIMARY KEY (`titleID`),
  KEY `category` (`category`),
  CONSTRAINT `titles_ibfk_1` FOREIGN KEY (`category`) REFERENCES `categories` (`catid`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;


CREATE TABLE `stats` (
  `statid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `score` decimal(3,2) DEFAULT NULL,
  `views` int(11) unsigned DEFAULT NULL,
  `favs` int(11) DEFAULT NULL,
  `comments` int(11) DEFAULT NULL,
  `updatedate` date NOT NULL,
  `title` int(11) unsigned NOT NULL,
  PRIMARY KEY (`statid`),
  KEY `title` (`title`),
  CONSTRAINT `stats_ibfk_1` FOREIGN KEY (`title`) REFERENCES `titles` (`titleID`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;

我的目标:

1)我想要一个查询,为我提供每个标题的所有最新统计数据。

2)我想看标题的文本名称(来自titles表)。

我可以使用此查询获取每个标题的最新分数。

select t.score, t.views, t.favs, t.comments, t.updatedate, t.title
from stats t 
inner join (
select title, max(updatedate) as updatedate 
from stats
GROUP BY title
) tm on t.title = tm.title and t.updatedate = tm.updatedate 

但是这个查询的问题是它显示了stats中的标题列,这是一个int。我想要标题的文字名称。

我可以这样做以获得标题名称和分数,但之后我没有获得最新日期的行。

select titlename, score, updatedate
from stats
inner join titles
on titleid = title

如何编写能够实现我的目标的查询?

1 个答案:

答案 0 :(得分:1)

在这种情况下,你需要加入title

select 
s1.score, 
s1.views, 
s1.favs, 
s1.comments, 
s1.updatedate, 
t.titlename
from titles t 
join stats s1 on s1.title = t.titleID
join (
 select title, max(updatedate) as updatedate 
 from stats
 GROUP BY title
) s2 on s2.title = s1.title and s1.updatedate = s2.updatedate