场景如下
一个奖品表,一个奖品领取记录表
每个奖品有限制每个用户可领取数,0为不限制,要求把某个用户还能领取的奖品显示出来
#奖品表
CREATE TABLE `prize` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(20) NOT NULL COMMENT '奖品名称',
`quota` int(11) NOT NULL COMMENT '每个用户可领取数,0为不限制',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
#领取记录表
CREATE TABLE `record` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`uid` int(11) NOT NULL COMMENT '用户id',
`pid` int(11) NOT NULL COMMENT '领取的奖品id',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
插入模拟数据
INSERT INTO `prize` (`id`, `name`, `quota`) VALUES
(1, '奖品1', 1),
(2, '奖品2', 0),
(3, '奖品3', 2),
(4, '奖品4', 1);
INSERT INTO `record` (`id`, `uid`, `pid`) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 2),
(4, 1, 3),
(5, 1, 3);
用户1领取了奖品1一个,奖品2两个,奖品3两个,那么根据要求他还可以继续领奖品2和奖品4,我摸黑写了2条sql,都能符合要求,所以想请教那条效率高,分析解释下
SELECT * FROM `prize` as a left join (select COUNT(*) as `count`,pid from `record` where uid=1 GROUP by pid) as c on a.id=c.pid where a.quota=0 or isnull(c.`count`) or a.quota>c.`count`
SELECT * FROM `prize` where id not in (SELECT pid from (select COUNT(*) as `count`,pid from `record` where uid=1 GROUP by pid) as c where quota <> 0 and c.`count`>=quota)
===============更新==================
搞了5千条奖品记录,模拟了50个用户领取总计10万条领取记录,测试结果
2条sql执行时间没有明显差异,都在0.01s内
放下这2条的执行计划
顺便放下@凌晨消失の夏日 同学的,他这个非常慢,我的mysql都被卡死了,也不懂为什么会这样
以上供各位分析对比
你可以测试一下