我必须创建一个对mysql数据库的查询,这对我来说太复杂了,以至于我不明白如何创建它。我需要选择所有一年或一年以上不活跃的用户。如果用户在过去一年中至少添加了1条评论,1条请求或1条消息,则该用户处于活动状态。 应该是这样的:
选择*从用户正在注册的日期 还有...,如果他有任何评论:
AND Comment.CommentDate 并且...如果他有任何要求:
AND Requests.RequestDate 和...,如果他有任何消息:
AND Messages.MessageDate 但是该查询无法以这种方式工作,因为如果用户没有任何消息,但是具有非常老的请求或注释,则查询将不会选择他。我认为,我需要在查询中添加IF()或CASE(),但是我不知道如何。 示例:4个表格:用户,评论,消息,请求 应选择: UserA,注册时间10.05.2017,没有消息,没有请求,有2条评论,最后一个-15.05.2017 UserC,注册了15.08.2017,几个请求,最后一个-16.08.2017,几个评论最后一个-在17.08.2017,一些消息,最后一个-18.08.2017 不应选择: 你能帮忙吗? 谢谢。 结果:
我尝试将您的答案中的内容结合起来,例如: 这是真实的查询,我需要合并表User和UserFields,但会收到错误消息:1054-on子句中的未知列u.UserID
似乎“ ON”子句是正确的……但是为什么它不起作用? 最终结果:
我将使用以下查询: 但是将在此处添加评论和消息表。我只尝试了Request,似乎效果很好... 感谢所有帮助过的人!
select u.Email, uf.Phone
from User u, UserFields uf
LEFT JOIN Request r ON u.UserID = r.UserID
where u.UserID=uf.UserID
and u.TimeCreated < DATE_SUB(NOW(),INTERVAL 1 YEAR)
and u.UserID NOT IN (select r.UserID from Request as r where u.UserID=r.UserID AND r.TimeCreated >= DATE_SUB(NOW(),INTERVAL 1 YEAR))
LIMIT 0,100
select u.Email, uf.FirstName, uf.LastName, uf.Phone, r.TimeCreated as ReqTime
from User u
INNER JOIN UserFields uf ON u.UserID=uf.UserID
LEFT JOIN Request r ON r.UserID=u.UserID
where u.TimeCreated < DATE_SUB(NOW(),INTERVAL 1 YEAR)
GROUP BY u.Email
HAVING
(ReqTime < DATE_SUB(NOW(),INTERVAL 1 YEAR) OR ReqTime is NULL)
LIMIT 0,100
答案 0 :(得分:1)
我想您可以根据您的条件使用关注来吸引用户
SELECT *
FROM Users u
WHERE (u.RegDate < CURRENT_DATE() -INTERVAL 1 YEAR)
AND NOT EXISTS ( SELECT 1 FROM Comments WHERE user_id = u.id AND CommentDate > CURRENT_DATE()-INTERVAL 1 YEAR)
AND NOT EXISTS ( SELECT 1 FROM Requests WHERE user_id = u.id AND RequestDate > CURRENT_DATE()-INTERVAL 1 YEAR)
AND NOT EXISTS ( SELECT 1 FROM Messages WHERE user_id = u.id AND MessageDate > CURRENT_DATE()-INTERVAL 1 YEAR)
或通过连接,您可以将其写为
SELECT u.id, u.name ,MAX(c.CommentDate) CommentDate ,MAX(r.RequestDate) RequestDate ,MAX(m.MessageDate) MessageDate
FROM Users u
LEFT JOIN Comments c ON u.id = c.user_id
LEFT JOIN Requests r ON u.id = r.user_id
LEFT JOIN Messages m ON u.id = m.user_id
WHERE u.RegDate < CURRENT_DATE() - INTERVAL 1 YEAR
GROUP BY u.id, u.name
HAVING MAX(c.CommentDate) < CURRENT_DATE() - INTERVAL 1 YEAR
AND MAX(r.RequestDate) < CURRENT_DATE() - INTERVAL 1 YEAR
AND MAX(m.MessageDate) < CURRENT_DATE() - INTERVAL 1 YEAR
答案 1 :(得分:1)
我认为这些表是以这种方式连接的:
编辑:为了避免混淆,我已经完全重新设计了答案。
无论如何,在执行JOIN + GROUP BY方法时,以下查询应适合您的情况:
select
u.*,
max(c.comment_date) 'last_comment',
max(r.request_date) 'last_request',
max(m.message_date) 'last_message'
from user u
left join comment c on u.id = c.user_id
left join request r on u.id = r.user_id
left join message m on u.id = m.user_id
where
u.register_date < NOW() - INTERVAL 1 YEAR
group by
u.id
having
(last_comment < NOW() - INTERVAL 1 YEAR OR last_comment is NULL)
AND (last_request < NOW() - INTERVAL 1 YEAR OR last_request is NULL)
AND (last_message < NOW() - INTERVAL 1 YEAR OR last_message is NULL);
答案 2 :(得分:1)
我们也可以使用not in
准则获得结果。
我尝试了以下查询和示例数据
select u.* from Users as u
where u.RegisterDate < DATE_SUB(NOW(),INTERVAL 1 YEAR)
and u.id not in (select c.id from Comments as c where c.comment_date >= DATE_SUB(NOW(),INTERVAL 1 YEAR))
and u.id not in (select r.id from Requests as r where r.request_date >= DATE_SUB(NOW(),INTERVAL 1 YEAR))
and u.id not in (select m.id from Messages as m where m.message_date >= DATE_SUB(NOW(),INTERVAL 1 YEAR))
有关示例数据,请使用以下查询
CREATE TABLE Users (
ID int NOT NULL,
Name varchar(255) NOT NULL,
RegisterDate datetime,
PRIMARY KEY (ID)
);
CREATE TABLE Comments (
ID int NOT NULL,
comment varchar(255),
comment_date datetime,
user_id int,
PRIMARY KEY (ID),
FOREIGN KEY (user_id) REFERENCES Users(ID)
);
CREATE TABLE Requests (
ID int NOT NULL,
request varchar(255),
request_date datetime,
user_id int,
PRIMARY KEY (ID),
FOREIGN KEY (user_id) REFERENCES Users(ID)
);
CREATE TABLE Messages (
ID int NOT NULL,
message varchar(255),
message_date datetime,
user_id int,
PRIMARY KEY (ID),
FOREIGN KEY (user_id) REFERENCES Users(ID)
);
insert into Users(ID, Name, RegisterDate) values
(1, 'User A', STR_TO_DATE('10.05.2017', '%d.%m.%Y')),
(2, 'User B', STR_TO_DATE('11.05.2018', '%d.%m.%Y')),
(3, 'User C', STR_TO_DATE('15.08.2017', '%d.%m.%Y')),
(4, 'User D', STR_TO_DATE('10.04.2017', '%d.%m.%Y'))
;
insert into Comments (ID, user_id, comment_date) values
(1, 1, STR_TO_DATE('14.05.2017', '%d.%m.%Y')),
(2, 1, STR_TO_DATE('15.05.2017', '%d.%m.%Y')),
(3, 3, STR_TO_DATE('17.08.2017', '%d.%m.%Y')),
(4, 4, (NOW() - INTERVAL 10 MONTH))
;
insert into Requests (ID, user_id, request_date) values
(1, 3, STR_TO_DATE('16.08.2017', '%d.%m.%Y'))
;
insert into Messages (ID, user_id, message_date) values
(1, 3, STR_TO_DATE('18.08.2017', '%d.%m.%Y')),
(2, 4, STR_TO_DATE('10.06.2017', '%d.%m.%Y'))
;