包含IF或CASE的MySQL查询以选择非活动用户

时间:2018-10-24 08:35:47

标签: mysql

我必须创建一个对mysql数据库的查询,这对我来说太复杂了,以至于我不明白如何创建它。我需要选择所有一年或一年以上不活跃的用户。如果用户在过去一年中至少添加了1条评论,1条请求或1条消息,则该用户处于活动状态。 应该是这样的:

选择*从用户正在注册的日期

还有...,如果他有任何评论: AND Comment.CommentDate

并且...如果他有任何要求: AND Requests.RequestDate

和...,如果他有任何消息: AND Messages.MessageDate

但是该查询无法以这种方式工作,因为如果用户没有任何消息,但是具有非常老的请求或注释,则查询将不会选择他。我认为,我需要在查询中添加IF()或CASE(),但是我不知道如何。

示例:4个表格:用户,评论,消息,请求

应选择:

  1. UserA,注册时间10.05.2017,没有消息,没有请求,有2条评论,最后一个-15.05.2017

  2. UserC,注册了15.08.2017,几个请求,最后一个-16.08.2017,几个评论最后一个-在17.08.2017,一些消息,最后一个-18.08.2017

    < / li>

不应选择:

  1. UserD,于2017年10月10日注册,他有一条来自2017年11月10日的评论(不超过1年)和一条来自10年10月6日(超过1年的信息)的消息

你能帮忙吗?

谢谢。

结果: 我尝试将您的答案中的内容结合起来,例如:

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

这是真实的查询,我需要合并表User和UserFields,但会收到错误消息:1054-on子句中的未知列u.UserID 似乎“ ON”子句是正确的……但是为什么它不起作用?

最终结果: 我将使用以下查询:

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

但是将在此处添加评论和消息表。我只尝试了Request,似乎效果很好...

感谢所有帮助过的人!

3 个答案:

答案 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)

我认为这些表是以这种方式连接的:

  1. 用户1 --- *注释(外键:user_id)
  2. 用户1 --- *请求(FK:user_id)
  3. 用户1 --- *消息(FK:user_id)

编辑:为了避免混淆,我已经完全重新设计了答案。

无论如何,在执行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'))
;