2011-08-03 4 views
1

두 개의 테이블이 있습니다. 하나는 장치와 해당 서비스 시간입니다. 각 장치는 여러 서비스를 가질 수 있습니다. 마지막 서비스가 3 개월 이상인 기기를 찾고 있습니다. 나는 이것을 시도했다. 물론 작동하지 않았다. :Mysql 데이터 항목이 이전 버전보다 MAX (날짜)

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); 

원하는 결과를 얻으려면 어떻게해야합니까?

답변

2

쿼리에 GROUP BY devices.id을 추가하고 조건을 HAVING 절 (그룹화 후 평가)으로 변경하십시오. 장치 당 MAX(services.servicetime)으로 지정하면 현재 결과 집합에 서비스 당 하나의 행이 포함됩니다. 당신이 서비스 된 적이없는 장치를 포함 할 경우

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 

, 다음 마지막에 OR MAX(services.servicetime) IS NULL를 추가합니다.

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

이 참고 : 다른 RDBMS는 모두'devices.id, devices.name'에 GROUP BY를 필요로 – gbn

+0

두 분 모두에게 감사드립니다. – Andre

1
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; 
는 절입니다. MySQL 만 모호성을 허용합니다.
0
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)