J'ai rencontré un problème plutôt étrange. J'ai les données d'exemple suivantes pour travailler dans une base de données MySQL:SQL: Nécessité de limiter le jeu de résultats en fonction d'une sous-requête
|key| data| index | total | timestamp | | # | a | 1 | 2 | 2009-01-02 01:01:32 | | $ | b | 2 | 2 | 2009-01-02 01:03:32 | | % | c | 1 | 3 | 2009-01-03 01:01:32 | |^| d | 2 | 3 | 2009-01-03 01:04:32 | | & | e | 3 | 3 | 2009-01-03 01:02:32 | | * | f | 1 | 2 | 2009-01-05 01:01:32 |
Qu'est-ce qui se passe est qu'un autre processus (pas sous mon contrôle) reçoit des paquets de données, et de les stocker directement dans la base de données avec un horodatage pour heure d'arrivée. Les paquets sont censés arriver en rafale ... a, b arriveront près l'un de l'autre et sont indexés 1 et 2, chaque paquet contenant le nombre "total" de paquets transmis. La clé est une clé primaire auto-incrémentée normale. Ce dont j'ai besoin est une vue qui affichera la liste la plus récente qui est arrivée (liste partielle, si tous les paquets sont arrivés, est acceptable).
Pour la requête ci-dessus, le résultat devrait idéalement être "f", mais je ne vois pas de moyen de le faire. Si nous ne pouvons pas l'obtenir d'une autre manière, retourner "a" et "f" serait acceptable. En d'autres termes, une petite quantité de données supplémentaires capturées par l'instruction select n'est pas un gros problème. Pour la période précédant l'arrivée de «f», le bon retour est c, d et e.
Mes pensées générales ont été le long des lignes de:
SELECT * FROM table WHERE total = ( SELECT total FROM table WHERE timestamp = ( SELECT MAX(timetamp) FROM table ) ) ORDER BY DESC timestamp LIMIT ( SELECT total FROM table WHERE timestamp = ( SELECT MAX(timetamp) FROM table )
Comme certains d'entre vous ont probablement remarqué, vous ne pouvez pas faire une sous-requête dans la clause LIMIT (au moins avec MySQL). Quelqu'un at-il une autre approche pour résoudre ce problème? La requête ci-dessus peut être rendue beaucoup plus propre en imbriquant un JOIN à une petite liste d'identifiants récents, mais cela laisse toujours le problème LIMIT-subquery dans la sous-requête.
En deux requêtes de la scène, ce qui est relativement trivial. Le problème est qu'il doit devenir l'instruction select de définition pour une vue.
Modifier pour corriger mauvais exemple sql
Pouvez-vous essayer d'expliquer clairement ce qui constitue «le plus récent»? Puisque vous dites que "F" et "A" seraient acceptables, cela ne semble pas être un horodatage direct. –
J'assumais une approche dans laquelle vous garantissiez des valeurs "index" uniques, en vous assurant de ne pas retourner plus de lignes "totales". Fondamentalement disant que, bien qu'il soit critique pour "f" d'être retourné, retourner "a" aussi ne serait pas un défaut fatal. – user73917
Il est dommage qu'il n'y ait pas d'identifiant pour chaque collection, si vous avez une collection sur 2 jours, ou si deux collections se chevauchent, vous allez avoir des problèmes. – Adam