MySQL:在一对多表上查询条件

时间:2014-04-24 14:46:16

标签: mysql

我有一个包含这样的架构的表:

clients_actions
id | client_id | action | date_done
1  | 1         | ...    | 1394785392
2  | 2         | ...    | 1394786392
3  | 2         | ...    | 1394787392

date_done可以在过去和当前的unix时间戳中设置。我需要选择所有被遗忘的'客户,将来没有设置date_done(在他的所有行动中)并且最后他的行动超过604800秒(7天)。客户可以有很多动作。而且,如果可能的话,我需要在同一个查询中选择他的最后一个动作(过去和超过7天)。

怎么做?

3 个答案:

答案 0 :(得分:1)

一种方法

select * from clients_actions 
where from_unixtime(date_done) < date_sub(now(),INTERVAL 7 day) 
AND client_id
NOT IN
(
  select client_id from 
  clients_actions
  where from_unixtime(date_done) > now()
)
;

<强> DEMO

在演示中,我添加了一些未来日期的数据,以便可以忽略这些数据,只需获取超过7天的数据。如果表格中有重复数据,您可以进行分组。

答案 1 :(得分:0)

 Select client_id, action, MAX(date_done) from clients_actions 
 WHERE date_done < (UNIX_TIMESTAMP(SYSDATE() - 7)
 AND id NOT IN (SELECT id FROM clients_actions 
                WHERE date_done > (UNIX_TIMESTAMP(SYSDATE()))
 GROUP BY client_id;

对于第一部分,您需要一个具有Where date_done&lt; SysDate - 7天且client_id不在(从clients_actions中选择id,其中date_done&gt; SysDate(也转换为UNIX)。这表示我想要所有date_done早于7天前的记录,但是没有任何操作将来会发生。

MAX和group by client_id将其限制为client_id选择的最新记录。

答案 2 :(得分:0)

以下查询将为您提供所需的结果。

SELECT *
FROM clients_actions ca
INNER JOIN
    (SELECT client_id, MAX(date_done) as date_done
    FROM clients_actions
    WHERE DATEDIFF(CURRENT_TIMESTAMP, FROM_UNIXTIME(date_done)) >= 7
    GROUP BY client_id) latest_date
ON ca.client_id = latest_date.client_id AND ca.date_done = latest_date.date_done;