2011-08-03 15 views
1

私は2つのテーブルを持っています.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)とし、現在の結果セットにサービスごとに1行が含まれるようにします。あなたがサービスされたことのないデバイスを含めたい場合は

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を追加します。

+0

FYI:他のRDBMSは 'devices.id、devices.name'両方にGROUP BYが必要となります。 MySQLだけがあいまいさを許します – 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; 
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) 
0

GROUP BY and HAVINGあなたの句です:

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); 
関連する問題