2017-10-11 9 views
-1

J'ai une table MySQL qui conserve les enregistrements historiques des objets (chaque état de l'objet est dans une ligne différente) et je veux y trouver des objets dont le champ (colonne) a changé directement d'une valeur à l'autre donc la condition touche 2 rangs.Modèle général pour le filtrage vertical dans MySQL

row1_col1, row1_col2, ..., 22, ..., '2017-08-08 20:11:06.501658' 
... 
... -- some rows with different values than 11 and 22 
... 
row21_col1, row21_col2, ..., 11, ..., '2017-08-28 18:13:16.490628' 
row22_col1, row22_col2, ..., 22, ..., '2017-08-28 20:11:06.501658' 
... 
... -- some rows with different values than 11 and 22 
... 
row101_col1, row101_col2, ..., 11, ..., '2017-11-28 18:13:16.490628' 

Pour simplifier, disons que ce sera un changement du 11 au 22, suivant immédiatement après, si la première et la dernière rangée doivent être filtrés. (la condition réelle est sur 4 colonnes)

Y a-t-il une approche autre que la programmation en boucle? (ce qui signifie tout ce qui limitera les hits à la base de données et l'approche générale sur mysql layer pour ce problème)

+0

Veuillez envoyer une sortie expexée pour certaines entrées de test et peut-être aussi certaines de vos tentatives –

+0

Pourriez-vous rendre cette question plus opaque? Voir: [Pourquoi devrais-je fournir un MCVE pour ce qui me semble être une requête SQL très simple?] (Https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve- pour-ce-qui-me-semble-à-être-un-très-simple-sql-query) – Strawberry

Répondre

0

En fait, je pense que c'est une bonne question, parce que je demande une approche générale, mais en raison de la limitation de l'agrégation dans MySQL (comme ordre n'est pas conservé et n'est pas garanti pour chaque colonne lors du regroupement, ou des conditions interdépendantes) presque impossible de le faire en une seule requête.

Mon approche, le travail utilise des tables temporaires:

  1. préparer la requête (comme table temporaire) avec 1ère partie de l'état ayant le plus éloigné ligne dans le tableau d'enregistrements (dans l'exemple ci-dessus est un disque ayant 22 de le centre de données/tableau ci-dessus)
  2. préparer la requête (comme table temporaire) avec la 2ème partie de condition ayant la ligne la plus proche avant (index, valeur) de la première ligne de table temporaire dans la table des enregistrements (renvoyant 11 du au centre de données). s'il vous plaît noter: cette table lors de la création utiliser la première table temporaire.
  3. ayant ci-dessus recueillies avec des colonnes supplémentaires requises, nous ne pouvons comparer 2 curseurs (2 sorties préparées dans des tables temporaires)

et il limitera les 3 requêtes, il est donc facile à exécuter sur table plus grande.