Maison > Questions et réponses > le corps du texte
J'ai deux tables Service
和 Status
。服务表只保存一个name
和一个id
| id | name | |----|-------| | 1 | Test1 | | 2 | Test2 |
Il existe également une table d'état comme celle-ci
| id | status | service_id | timestamp | |----|--------|------------|---------------------------| | 1 | OK | 1 | October, 15 2015 09:03:07 | | 2 | OK | 1 | October, 15 2015 09:08:07 | | 3 | OK | 2 | October, 15 2015 10:05:23 | | 4 | OK | 2 | October, 15 2015 10:15:23 |
Je veux obtenir de telles données
| id | name | status | timestamp | |----|-------|--------|---------------------------| | 1 | Test1 | OK | October, 15 2015 09:08:07 | | 2 | Test2 | OK | October, 15 2015 10:15:23 |
Dernier statut avec les données de service. J'ai essayé cette déclaration
SELECT ser.id, ser.name, a.status, a.timestamp from Service ser inner join (select * from status order by Status.timestamp DESC limit 1) as a on a.service_id = ser.id
Mais tout ce que j'ai eu, c'est
| id | name | status | timestamp | |----|-------|--------|---------------------------| | 2 | Test2 | OK | October, 15 2015 10:15:23 |
Comment puis-je modifier la déclaration pour obtenir ce que je veux ?
Pour tester SQL Fiddle
P粉0236500142023-12-31 18:20:46
Pour chaque service, à utiliser uniquement si aucun service ultérieur n'existe NOT EXISTS
Statut de retour :
select ser.id, ser.name, st.status, st.timestamp from service ser left join status st1 on ser.id = st1.service_id where not exists (select 1 from status st2 where st2.service_id = st1.service_id and st2.timestamp > st1.timestamp)
Vous pouvez choisir d'exécuter LEFT JOIN
来返回没有任何状态的服务。如果不需要,请切换到 JOIN
.
P粉7528260082023-12-31 13:53:21
Vous pouvez faire ceci :
SELECT ser.id, ser.name, s.status, s.timestamp FROM Service ser INNER JOIN status as s ON s.service_id = ser.id INNER JOIN ( SELECT service_id, MAX(timestamp) AS MaxDate FROM status GROUP BY service_id ) AS a ON a.service_id = s.service_id AND a.MaxDate = s.timestamp;
Rejoindre avec la sous-requête :
SELECT service_id, MAX(timestamp) AS MaxDate FROM status GROUP BY service_id
Éliminera tous les statuts sauf la dernière date.