Vous ne savez pas si ceci est une requête facile ou non, mais pour une raison quelconque, je ne peux pas comprendre ...
J'ai cet enregistrement des modifications de statut de l'ordre décroissant (plus ancien au plus récent): P> XXX PRE>
mais je veux seulement retourner SELECT
Instrument.Name AS Name,
Status.Name AS Status,
Operation.Time AS Time,
FROM Operation
INNER JOIN Instrument ON Instrument.Id = Operation.InstrumentId
INNER JOIN Status ON Status.Id = Operation.StatusId
WHERE Instrument.Name = ?;
3 Réponses :
Idéalement, vous voulez Une méthode est une sous-requête corrélée: p> dans les versions plus récentes de MySQL, vous pouvez simplement faire: p> Lag () CODE> et pour sélectionner à partir de celui-ci. Permettez-moi de supposer que vous êtes pré-v8 de mysql.
Merci pour la réponse rapide! (Fyi je suis sur MySQL 5.7) J'essaye cela maintenant, mais je suis en train de courir à certains problèmes puisque ma requête fait également d'autres adhésions (bien que je ne pensais pas que cela importait de la solution globale) la question à ajouter plus de détails.
Vient de mettre à jour la question. J'ai essayé d'utiliser ma requête à la place du second Sélectionnez T. * Code> Vous avez écrit, mais ne semble pas que c'est comme ça que c'est la façon de le faire ... Je suppose que le 3ème SELECT devrait rester comme Pour spécifier les colonnes, je filtrant?
J'ai fait un peu générique essai avec la requête externe en cours d'exécution à la ligne correspondant au résultat de la sous-pérature via Groupes CODE> La sortie est la façon dont les lignes ne sont pas correctement triées. Peut vérifier si cela fonctionne pour vous. SELECT
Instrument.Name AS Name,
DISTINCT(Status.Name) AS Status,
Operation.Time AS Time,
FROM Operation
INNER JOIN Instrument ON Instrument.Id = Operation.InstrumentId
INNER JOIN Status ON Status.Id = Operation.StatusId
WHERE ( Name,
Status,
Time )
IN
(SELECT
Instrument.Name AS Name1,
Status.Name AS Status1,
Operation.Time AS Time1,
FROM Operation
INNER JOIN Instrument ON Instrument.Id = Operation.InstrumentId
INNER JOIN Status ON Status.Id = Operation.StatusId
group by NAME1, Status1 having Time1=min(Time1)
)
Une autre approche utilise une table pseudo temporaire (impossible d'utiliser une table temporaire réelle car MySQL n'autorisera pas de multiples sous-candidats à l'une) c'est-à-dire la table d'origine avec un "numéro de rangée" en annexé comme clé primaire: < Pré> xxx pré>
puis la requête devient simplement: p>