有两个表:用户表:
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语句也行。就剩这些分了,全押上。其它的分刚才都被我押在赌场了 :)。
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,就这么定了。 马上结贴!