【发布时间】:2016-07-14 08:44:21
【问题描述】:
这样的查询:
select * from employe_info
where id in
(
select max(id)
from employe_info
where date < '2016-02-01'
group by employe_id
)
and `level` = 1
limit 10
employe_info 有一百万行。我想查询最近的employe_info 然后过滤。有什么办法可以优化或者新的表设计吗?
下面是简单的建表语句:
CREATE TABLE `employe` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `employe_info` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`employe_id` int(10) DEFAULT NULL,
`level` int(2) DEFAULT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_employe` (`employe_id`),
KEY `date_index` (`date`) USING BTREE,
CONSTRAINT `fk_employe` FOREIGN KEY (`employe_id`) REFERENCES `employe` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
员工的水平随日期而变化。员工具有多层次的价值观。所以我想在某个日期之前查询员工的最新级别。
INSERT INTO `employe` (`name`, `address`) VALUES ('joe', 'joe address');
INSERT INTO `employe` (`name`, `address`) VALUES ('mads', 'mads address');
INSERT INTO `employe` (`name`, `address`) VALUES ('max', 'max address');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('1', '1', '2016-01-01');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('2', '1', '2016-01-02');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('3', '1', '2016-01-03');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('1', '2', '2015-01-01');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('2', '3', '2015-10-02');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('3', '4', '2015-08-03');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('1', '6', '2015-06-01');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('2', '2', '2015-09-02');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('3', '4', '2015-06-03');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('1', '1', '2015-07-01');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('2', '1', '2015-10-02');
INSERT INTO `employe_info` (`employe_id`, `level`, `date`) VALUES ('3', '1', '2015-11-03');
【问题讨论】:
-
select * from employee_info where id in ( select max(id) from employee_info where date
标签: mysql optimization group-by where