2015-11-09 3 views
0

J'ai une requête MySQL où je suis en train de faire:MYSQL - Sélection de la date la plus récente pour chaque enregistrement (sous-requêtes corrélées)

  • le service le plus récent d'un véhicule par date (obtenu à partir du tableau de réparation) (tout ce qui est pas « Aucun » de serviceType signifie qu'il est un service)
  • et le dernier compteur de véhicule par date (obtenue à partir du tableau de ravitaillement de véhicules)

Dans un seul enregistrement tout en ayant un ID de véhicule pour chaque enregistrement. Les données sont obtenues à partir de 2 tables différentes en les regroupant par ID de véhicule dans des sous-requêtes.

SELECT 
r.vehicleCounter AS lastServiceCounter, 
vf.vehicleCounter AS currentCounter, 
r.dateFinished, 
r.type, 
v.vehicleID 
FROM vehicle AS v 
LEFT JOIN (
     SELECT r.repairID, 
     r.vehicleCounter, 
     r.dateFinished, 
     st.type, 
     r.vehicleID 
     FROM repair AS r 
     INNER JOIN servicetype AS st 
     ON st.serviceTypeID = r.serviceTypeID 

     WHERE st.type <> 'None' 
     AND r.dateFinished IN (
      SELECT MAX(dateFinished) 
      FROM repair 
      GROUP BY vehicleID 
     ) 
    ) AS r 
    ON r.vehicleID = v.vehicleID 
LEFT JOIN (
    SELECT vehicleCounter, vehicleID 
    FROM vehiclefueling 
    WHERE date IN(
     SELECT MAX(date) 
     FROM vehicleFueling 
     GROUP BY vehicleID 
    ) 
) AS vf ON vf.vehicleID = v.vehicleID 

Pendant l'exécution de cette requête, je devrais avoir seulement un dossier pour chaque ID, mais au moment de la requête renvoie le même ID avec des valeurs différentes pour un enregistrement (check ID 11):

returned query

Je pourrais utiliser GROUP BY VehicleID pour la requête principale, mais je veux garder la valeur la plus récente

Répondre

1

je recevrais la réparation et de ravitaillement en carburant ids en utilisant les sous-requêtes corrélées:

select v.*, 
     (select r.repairId 
     from repairs r 
     where r.vehicleID = v.vehicleID 
     order by r.datefinished desc 
     limit 1 
     ) as repairid, 
     (select vh.vehiclefuelingId 
     from vehiclefueling vh 
     where vh.vehicleID = v.vehicleID 
     order by vh.date desc 
     limit 1 
     ) as vehiclefuelingId 
from vehicle v; 

Ensuite, vous pouvez revenir aux deux tables pour obtenir des champs supplémentaires.

Cela devrait vous donner une idée de la façon d'aborder le problème. Votre exemple de requête comporte des tables et une logique supplémentaires qui ne correspondent pas directement à votre question.

+0

comment joindriez-vous les tables sans dupliquer les enregistrements? – Joseph118

+0

Je ne comprends pas votre commentaire. Cette version utilise une sous-requête corrélée pour renvoyer les enregistrements de réparation et de ravitaillement les plus récents. –

+0

Votre approche est en quelque sorte ce dont j'ai besoin mais pas ce que j'espérais. Je peux toujours saisir les identifiants et faire une autre requête, mais je veux y parvenir en une fois. disons de la table de réparation je ne veux pas seulement l'ID, je veux l'ID et le lastServiceCounter. Je pourrais toujours faire une autre sous-requête dans l'instruction select mais cela ne ralentirait-il pas le processus puisqu'elle doit faire plusieurs instructions select pour chaque enregistrement? – Joseph118