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

解决方案 »

  1.   

    select distinct User.*
    from Login inner join User on Login.uid=User.id
    where loginDate>DATE_SUB(CURDATE(),INTERVAL 10 DAY) 
      

  2.   

    楼主何不用ibatis,这样版主给的sql就可以直接用了
      

  3.   


    非常感谢!
    不知道inner join比sub select的效率能高多少? 对索引字段有没有要求?
      

  4.   


    嘿嘿,不好意思,ibatis没用过呢。
    hibernate和mysql还没搞熟练,不敢随便换。
      

  5.   

    不知道inner join比sub select的效率能高多少? 对索引字段有没有要求? 一般情况下join 比 in (select 效率上略高, 当然需要索引,你的Login.uid 和 User.id 需要建立索引。最好是有  (loginDate,.uid )的复合索引。
      

  6.   


    OK, thanks,就这么定了。 马上结贴!