Sélection parmi deux tables à l'aide de jointures internes avec contraintes
P粉393030917
P粉393030917 2024-03-26 18:57:43
0
2
327

J'ai deux tables ServiceStatus。服务表只保存一个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粉393030917
P粉393030917

répondre à tous(2)
P粉312631645

Pour chaque service, utilisé 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écuterLEFT JOIN来返回没有任何状态的服务。如果不需要,请切换到 JOIN.

P粉340264283

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal