开发者

Mysql data entries older then MAX(date)

开发者 https://www.devze.com 2023-03-25 02:16 出处:网络
I have two tables, one with devices and on with corresponding service times. Each device can have several services. I\'m looking for d开发者_运维技巧evices which last service is older than 3 Months. I

I have two tables, one with devices and on with corresponding service times. Each device can have several services. I'm looking for d开发者_运维技巧evices which last service is older than 3 Months. I tried this, which of course didn't work:

SELECT devices.id, 
       devices.name,  
       services.servicetime 
FROM devices
    LEFT JOIN services 
        ON services.device_id = devices.id
WHERE MAX(services.servicetime) < DATE_SUB(NOW(), INTERVAL 3 MONTH);

How con i get the desired result?


Add GROUP BY devices.id to your query, and change the condition to a HAVING clause (evaluated after grouping). You want the MAX(services.servicetime) per device, where your current result set includes one row per service.

SELECT
  devices.id,
  devices.name,
  MAX(services.servicetime)
FROM
  devices
LEFT OUTER JOIN
  services
ON
  services.device_id = devices.id
GROUP BY
  devices.id
HAVING
  MAX(services.servicetime) < CURRENT_TIMESTAMP - INTERVAL 3 MONTH

If you want to include devices that have never been serviced, then add OR MAX(services.servicetime) IS NULL to the end.


SELECT devices.id, devices.name, MAX(services.servicetime)
FROM 
    devices
    LEFT JOIN
    services ON services.device_id=devices.id
GROUP BY
    devices.id, devices.name
HAVING
    MAX(services.servicetime) < DATE_SUB(NOW(), INTERVAL 3 MONTH)
    OR
    MAX(services.servicetime) IS NULL;


select devices.id,devices.name.services.servicetime from devices,services
where services.id = devices.id and services.id in 
(select services.id from services where
 DATE_SUB(NOW(), INTERVAL 3 MONTH) GROUP by services.id)


GROUP BY and HAVING is your clause:

SELECT devices.id, devices.name, max(services.servicetime) FROM devices
LEFT JOIN services ON services.device_id=devices.id
GROUP BY devices.id, devices.name
HAVING MAX(services.servicetime) < DATE_SUB(NOW(), INTERVAL 3 MONTH);
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号