I have two tables Service
and Status
. The service table only saves a name
and an id
| id | name | |----|-------| | 1 | Test1 | | 2 | Test2 |
There is also a state table like this
| 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 |
I want to get such data
| id | name | status | timestamp | |----|-------|--------|---------------------------| | 1 | Test1 | OK | October, 15 2015 09:08:07 | | 2 | Test2 | OK | October, 15 2015 10:15:23 |
Latest status with service data. I have tried this argument
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
but I only get
| id | name | status | timestamp | |----|-------|--------|---------------------------| | 2 | Test2 | OK | October, 15 2015 10:15:23 |
How do I change the statement to get what I want?
For testing SQL Fiddle
For each service, only use if no subsequent service exists
NOT EXISTS
Return status:You can choose to execute
LEFT JOIN
to return a service without any status. If not required, switch toJOIN
.You can do this:
Join with subquery:
Will eliminate all statuses except the latest date.