我有这两张桌子。
Loging Log
| id | datetime | iduser |
|----|------------|--------|
| 1 | 23/09/2016 | 1 |
| 2 | 22/09/2016 | 1 |
| 2 | 22/09/2016 | 2 |
Contacts
| id | name | created | iduser |
|----|---------|------------|--------|
| 1 | John | 24/09/2016 | 1 |
| 2 | Carl | 24/09/2016 | 1 |
| 3 | Michael | 20/09/2016 | 1 |
| 4 | David | 23/09/2016 | 2 |
基本上,我希望自上次登录每个用户以来从联系人表中获取所有联系人。
例如。从用户id = 1的最后一次登录是2016年9月23日,所以我想在2016年9月23日之后得到联系人的数量,并且还获得自上次登录以来的天数,期望的输出如下:
Output
| last login | days since last login | number of contacts | id user |
|------------|-----------------------|--------------------|---------|
| 23/09/2016 | 1 | 2 | 1 |
| 22/09/2016 | 2 | 1 | 2 |
先谢谢。
编辑:两个值都是日期时间字段
答案 0 :(得分:1)
试试这个
CREATE TABLE login_log (
id INT NOT NULL AUTO_INCREMENT,
datetime DATETIME NULL,
iduser INT NULL,
PRIMARY KEY (id));
CREATE TABLE contacts (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(45) NULL,
created DATETIME NULL,
iduser INT NULL,
PRIMARY KEY (`id`));
INSERT INTO login_log (datetime, iduser) VALUES ('2016-9-23', '1');
INSERT INTO login_log (datetime, iduser) VALUES ('2016-9-22', '1');
INSERT INTO login_log (datetime, iduser) VALUES ('2016-9-22', '2');
INSERT INTO contacts (name, created, iduser) VALUES ('john', '2016-9-24', '1');
INSERT INTO contacts (name, created, iduser) VALUES ('carl', '2016-9-24', '1');
INSERT INTO contacts (name, created, iduser) VALUES ('michael', '2016-9-20', '1');
INSERT INTO contacts (name, created, iduser) VALUES ('david', '2016-9-23', '2');
SELECT
DATE(MAX(datetime)) 'last login',
DATEDIFF(NOW(), MAX(datetime)) 'days since last login',
(SELECT
COUNT(*)
FROM
contacts c
WHERE
created > MAX(l.datetime)
AND c.iduser = l.iduser) 'number of contacts',
l.iduser 'id user'
FROM
login_log l
GROUP BY l.iduser
我的结果是
答案 1 :(得分:0)
将其分解为部分。首先,获取每个用户的最大日期时间:
select l.iduser, max(l.datetime) as maxdt
from log l
group by l.iduser;
然后,您可以通过各种方式获取其他信息。以下是使用相关子查询的一种方法:
select lu.*,
(select count(*)
from contacts c
where c.user_id = lu.user_id and
c.created > lu.maxdt
) as contacts_since
from (select l.iduser, max(l.datetime) as maxdt,
datediff(max(l.datetime), curdate()) as days_since
from log l
group by l.iduser
) lu;