两张桌子与将来的情况相比还是很小的。
已经在对一些常规查询进行测试时,出现了性能问题。
有人能告诉我一个更好的表结构或查询吗?
====
表1:电视节目(目前为117行)
表2:电视剧(目前为43000行)。
电视节目包含一个id,我们在电视节目中称之为t U id。
电视剧包含这个t_id和一个名为“剧集数”的字段。
每集有一个集数和一个季节数,集数是总的集数,而不考虑季节。
例如:所有季节都有10集:第2季第1集=第11集
现在查询:
我要每个电视节目的最新剧集。
SELECT tv.*,ep.* FROM tv_show tv
INNER JOIN tv_episodes ep ON ( tv.id = ep.t_id )
LEFT OUTER JOIN tv_episodes ep2
ON ( tv.id = ep2.t_id AND ep.episode_num < ep2.episode_num )
WHERE ep2.t_id is NULL
这很有效,但给服务器带来了非常困难的时间(查询时间超过10秒!)
请帮忙。
编辑:MySQL版本:*5.1.47
更新:感谢所有的解决方案,这是最快的一个。
SELECT tv_episodes.* ,tv_show.*
FROM tv_episodes
INNER JOIN
(
SELECT t_id, MAX(episode_num) AS episode_num
FROM tv_episodes
GROUP BY t_id
) max_eps
ON tv_episodes.t_id = max_eps.t_id AND tv_episodes.episode_num = max_eps.episode_num
INNER JOIN
tv_show ON tv_show.id=tv_episodes.t_id
CREATE TABLE `tv_show` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`specification` varchar(50) NOT NULL,
`year` int(4) NOT NULL,
`status` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `specification` (`specification`),
KEY `year` (`year`),
KEY `status` (`status`)
) ENGINE=MyISAM AUTO_INCREMENT=118 DEFAULT CHARSET=latin1
CREATE TABLE `tv_episodes` (
`id` int(255) NOT NULL AUTO_INCREMENT COMMENT 'e_id',
`t_id` int(200) NOT NULL,
`season` int(2) NOT NULL,
`episode` int(4) NOT NULL,
`episode_num` int(10) NOT NULL,
`airing` date NOT NULL,
`online` enum('1','2') NOT NULL COMMENT '1=yes 2=no',
`added` int(15) NOT NULL,
`title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `t_id` (`t_id`),
KEY `season` (`season`),
KEY `episode` (`episode`),
KEY `season_num` (`episode_num`),
KEY `airing` (`airing`),
KEY `added` (`added`)
) ENGINE=MyISAM AUTO_INCREMENT=43420 DEFAULT CHARSET=latin1
最佳答案
更新:根据你的最新评论和我自己的调整,我已经编辑了我的答案。
这应该返回TVY发作记录的每个TVYID具有最大EpSyDeSnNm
SELECT tv_episodes.*
FROM tv_episodes
INNER JOIN
(
SELECT t_id, MAX(episodes_num) AS episodes_num
FROM tv_episodes
GROUP BY t_id
) max_eps
ON tv_episodes.t_id = max_eps.t_id AND tv_episodes.episodes_num = max_eps.episodes_num;
关于sql - (MySQL)按组划分的最大数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3857314/