表1 ue
id name pr_id
1 aa 1
2 bb 2表2 pr
id name
1 oo
2 gg表3 kt
id ue_id time
1 1 2012-07-11 13:11:33
2 1 2012-07-11 13:11:33
3 1 2012-07-12 13:11:33
4 2 2012-07-12 13:11:33
如何用一条SQL根据kt.time查询完成以下的结果结果1:昨天
id name pr_name kt_num
1 aa oo 2
2 bb gg 0结果2:今天
id name pr_name kt_num
1 aa oo 1
2 bb gg 1结果3:N天前至今天的
id name pr_id
1 aa 1
2 bb 2表2 pr
id name
1 oo
2 gg表3 kt
id ue_id time
1 1 2012-07-11 13:11:33
2 1 2012-07-11 13:11:33
3 1 2012-07-12 13:11:33
4 2 2012-07-12 13:11:33
如何用一条SQL根据kt.time查询完成以下的结果结果1:昨天
id name pr_name kt_num
1 aa oo 2
2 bb gg 0结果2:今天
id name pr_name kt_num
1 aa oo 1
2 bb gg 1结果3:N天前至今天的
解决方案 »
- limit如何使用变量?
- 关联查询的问题
- 请教一个数据设计问题
- mysql_options()设置超时无效
- mysql中以下语句哪一个比较的快的
- 急死了,请求高手指点 mysql存储过程问题
- (寻高手讨论)MySQL5.1的连接缓存问题,菜鸟请浏览别参与讨论
- 用 SQL SERVER的导入和导出工具,把SQL SERVER里的数据库导入到mysql中,总是报BLOB不支持更新插入操作。我应该做什么方面的修改?
- mysql 执行了 update,数据库没做备份,能还原吗?
- 造数据,表字段如何取两年的时间
- C++中ADO调用MySQL存储过程失败,诡异的语法错误,求解中,附源码
- 真心求解、postgresql数据库使用between and的问题。。
(SELECT COUNT(*) FROM kt WHERE ue_id=a.`pr_id` AND DATE(TIME)=CURDATE() - INTERVAL 1 DAY) AS aa,
(SELECT COUNT(*) FROM kt WHERE ue_id=a.`pr_id` AND DATE(TIME)=CURDATE() ) AS aa1,
(SELECT COUNT(*) FROM kt WHERE ue_id=a.`pr_id`) AS aa2 FROM ue a LEFT JOIN pr b ON a.`pr_id`=b.`id`
SELECT a.`id`,a.`name`,b.`name`,
SUM(IF(DATE(TIME)=CURDATE() - INTERVAL 1 DAY,1,0)),
SUM(IF(DATE(TIME)=CURDATE() ,1,0)),COUNT(*) FROM ue a LEFT JOIN pr b ON a.`pr_id`=b.`id` LEFT JOIN kt c ON c.ue_id=a.`pr_id` GROUP BY a.`id`,a.`name`,b.`name`;
有没有更好的方法啊?
SUM(IF(DATE(TIME)=CURDATE() - INTERVAL 1 DAY,1,0)),
SUM(IF(DATE(TIME)=CURDATE() ,1,0)),
SUM(IF(DATE(TIME)<=CURDATE() ,1,0))
FROM ue a LEFT JOIN pr b ON a.`pr_id`=b.`id` LEFT JOIN kt c ON c.ue_id=a.`pr_id` GROUP BY a.`id`,a.`name`,b.`name`;
在ue `pr_id`
pr b.`id`
kt ue_id
上建立索引
pr b.`id`
kt ue_id这里设置主键好还是用索引好?又或者两者随便那一种都一样
id ue_id xv_id time
1 1 1 2012-07-11 13:11:33
2 1 2 2012-07-11 13:11:33
3 1 1 2012-07-12 13:11:33
4 2 1 2012-07-12 13:11:33
如果同条件下xv_id相同的话,只算1个,这个怎么弄呢?
form ue,pr
where ue.id=pr.id
select * from kt a where not exists(select 1 from kt where a.xv_id=xv_id and a.time=time
and a.id>id)
id ue_id xv_id time
1 1 1 2012-07-11 13:11:33
2 1 2 2012-07-11 13:11:33
3 1 1 2012-07-12 13:11:33
4 2 1 2012-07-12 13:11:33
如果同条件下xv_id相同的话,只算1个,这个怎么弄呢?3和4算1条
SUM(IF(DATE(TIME)=CURDATE() - INTERVAL 1 DAY,1,0)),
SUM(IF(DATE(TIME)=CURDATE() ,1,0)),
SUM(IF(DATE(TIME)<=CURDATE() ,1,0))
FROM ue a LEFT JOIN pr b ON a.`pr_id`=b.`id`
LEFT JOIN (SELECT * FROM kt a WHERE NOT EXISTS(SELECT 1 FROM kt WHERE a.xv_id=xv_id AND a.time=TIME
AND a.id>id)) c ON c.ue_id=a.`pr_id` GROUP BY a.`id`,a.`name`,b.`name`;KT:ue_id、ID、xv_id上建立复合索引
SELECT a.`id`,a.`name`,b.`name`,
SUM(IF(DATE(TIME)=CURDATE() ,1,0)) as kt_num FROM ue a LEFT JOIN pr b ON a.`pr_id`=b.`id` LEFT JOIN kt c ON c.ue_id=a.`pr_id` GROUP BY a.`id`,a.`name`,b.`name`;
表3 kt
id ue_id xv_id time
1 1 1 2012-07-12 13:11:33
2 1 2 2012-07-12 13:11:33
3 1 1 2012-07-12 13:11:33
4 2 1 2012-07-12 13:11:33
得到的结果是
id name pr_name kt_num
1 aa oo 3
2 bb gg 1实际是需要下面的结果
id name pr_name kt_num
1 aa oo 2
2 bb gg 1因为kt表中1和3只算1条
SUM(IF(DATE(TIME)=CURDATE() - INTERVAL 1 DAY,1,0)),
SUM(IF(DATE(TIME)=CURDATE() ,1,0)),
SUM(IF(DATE(TIME)<=CURDATE() ,1,0))
FROM ue a LEFT JOIN pr b ON a.`pr_id`=b.`id`
LEFT JOIN (SELECT * FROM kt a WHERE NOT EXISTS(SELECT 1 FROM kt WHERE a.xv_id=xv_id AND a.ue_id=ue_id
AND a.id>id)) c ON c.ue_id=a.`pr_id` GROUP BY a.`id`,a.`name`,b.`name`;KT:ue_id、xv_id、id上建立复合索引
ADD INDEX (`id`, `xv_id`, `ue_id`);是这样建立复合索引的?
CREATE INDEX kt1 ON kt (`id`, `xv_id`, `ue_id`)
不会,理论上只会更快。
create index xx on kt(ue_id,xv_id) 即可。