有两个表:用户表:
CREATE TABLE User(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32) NOT NULL,
password VARCHAR(32) NOT NULL,
....
);用户登录记录表
CREATE TABLE Login(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
uid BIGINT NOT NULL,
loginDate DATETIME NOT NULL,
logoutDate DATETIME,
.....
INDEX(uid),
INDEX(loginDate),
FOREIGN KEY (uid) REFERENCES user(id)
);我现在想根据登录记录表中“loginDate”字段来统计活跃用户,比如,10天内登录过
的用户算活跃用户,怎么能用一个SQL语句查询出所有活跃用户呢?
我暂时想了一个:
SELECT * FROM User u WHERE u.id IN
(SELECT DISTINCT uid FROM Login WHERE TO_DAYS(NOW())-TO_DAYS(loginDate)<10)不确定行不行,也担心它的效率,是否能应付大数据量的情况(因为设计用户数10万,登录记录可能达到数亿)。所以想找有经验的xd给个效率更高的SQL语句。 另外,数据层用的Hibernate,这两个表对应两个Entity,所以直接给出HQL语句也行。就剩这些分了,全押上。其它的分刚才都被我押在赌场了 :)。
CREATE TABLE User(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32) NOT NULL,
password VARCHAR(32) NOT NULL,
....
);用户登录记录表
CREATE TABLE Login(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
uid BIGINT NOT NULL,
loginDate DATETIME NOT NULL,
logoutDate DATETIME,
.....
INDEX(uid),
INDEX(loginDate),
FOREIGN KEY (uid) REFERENCES user(id)
);我现在想根据登录记录表中“loginDate”字段来统计活跃用户,比如,10天内登录过
的用户算活跃用户,怎么能用一个SQL语句查询出所有活跃用户呢?
我暂时想了一个:
SELECT * FROM User u WHERE u.id IN
(SELECT DISTINCT uid FROM Login WHERE TO_DAYS(NOW())-TO_DAYS(loginDate)<10)不确定行不行,也担心它的效率,是否能应付大数据量的情况(因为设计用户数10万,登录记录可能达到数亿)。所以想找有经验的xd给个效率更高的SQL语句。 另外,数据层用的Hibernate,这两个表对应两个Entity,所以直接给出HQL语句也行。就剩这些分了,全押上。其它的分刚才都被我押在赌场了 :)。
解决方案 »
- 一个表字段很多,有没有必要拆分两表
- 明明可以将数据放入一个数据库,却分了多个库,为嘛
- 带输出变量的存储过程调用问题
- 我在使用Java做一个mySql数据备份动作时出错
- mysql_query()函数执行失败,错误原因是断开连接了
- LINUX如何查看MYSQL日志存放在何处?
- sql高手进
- Delphi下调用MySql的存储过程疑问:只能采用TQuery控件,而不能采用TADOStoredProc控件吗(采用它总是报语法错误)?
- mysql command line client 和navicat不一致
- mysql 本地连接错误Can't connect to MySQL server on IP(10060)
- Mysql遍历
- 对于postgresql出现的问题
from Login inner join User on Login.uid=User.id
where loginDate>DATE_SUB(CURDATE(),INTERVAL 10 DAY)
非常感谢!
不知道inner join比sub select的效率能高多少? 对索引字段有没有要求?
嘿嘿,不好意思,ibatis没用过呢。
hibernate和mysql还没搞熟练,不敢随便换。
OK, thanks,就这么定了。 马上结贴!