2010-09-23 10 views
2

Je traite une table de base de données héritée qui n'a pas de colonne de date d'insertion ou de colonne d'identifiant unique, mais l'ordre naturel d'insertion est toujours valide lorsqu'elle est examinée avec un SELECT * simple montrant le plus ancien au plus récent.Inverser l '"ordre naturel" d'une table MySQL sans ORDER BY?

Je voudrais comme pour aller chercher ces données avec, mais inverser la pagination afin que si elle était ORDER BY date DESC

J'ai pensé à envelopper la requête, l'attribution d'un identifiant numérique aux lignes résultantes, puis faire une ORDER BY sur le résultat mais wow qui semble fou.

Existe-t-il une solution plus simple que je néglige?

Je ne peux pas ajouter de colonnes à la table existante, je dois travailler avec tel quel.

Merci pour vos idées!

+0

Ouch. Cela ressemble à une mission impossible. Je serais très intéressé si quelqu'un peut trouver une solution réalisable, cependant. – Spudley

+1

Vous feriez mieux d'ajouter la clé PRIMAIRE à la table. SQL ne garantit pas l'ordre paticulaire des enregistrements dans la table. Lorsque la commande sera brisée, vous ajouterez la clé de toute façon. Donc, plus vite vous le ferez, plus vous économiserez de temps à l'avenir. –

+0

J'ai une situation connexe où la table a effectivement un horodatage, mais plusieurs lignes peuvent être insérées dans la même seconde. Il s'agit d'une table de journalisation/audit, il n'y a donc aucune règle selon laquelle chaque ligne doit être unique, et encore moins posséder une clé naturelle unique. Quand je trier par horodatage, je suis parfois confus par l'ordre des événements dans la même seconde. – Brilliand

Répondre

3

Utilisez @rownum dans votre requête au numéro de chaque ligne, puis commande par le @rownum desc. Voici an example. Enfin, il est déconseillé de se fier à la commande en cours retournée à long terme.

+0

Ah, c'est un exemple pratique de ce dont je rêvais au milieu de ma question. Je vous remercie. Ce que je crains cependant, c'est que la table puisse être assez grande à un moment donné et que la lecture en boucle de toutes les lignes puisse prendre un certain rendement. Pourtant, ce pourrait être le seul moyen. –

+0

La solution que je suggère ne nécessite aucune boucle. Les données sont extraites directement de la base de données dans l'ordre souhaité. –

+0

Oui, je comprends. Et je viens de le tester et ça a l'air de bien fonctionner. Ce que je voulais dire en faisant une boucle, c'est que mysql devra tirer toutes les lignes pour les numéroter et ensuite atteindre les 10 dernières (par exemple, si c'est la pagination désirée). –

1

Si vous écrivez une application pour traiter les données, une autre approche peut être d'exécuter votre requête en cours, puis de parcourir les enregistrements renvoyés du dernier au premier.

Si vous avez trop d'enregistrements, vous pouvez utiliser une vue. C'est un objet de base de données qui peut être utilisé pour combiner des données provenant de différentes tabls, ou présenter une vue modifiée d'une seule table, entre autres choses. Dans ce cas, vous pouvez essayer de créer une vue de votre table et d'ajouter une colonne d'ID générée. Vous pouvez ensuite exécuter des instructions SELECT par rapport à cette vue en fonction de la nouvelle colonne que vous avez ajoutée.

Cependant, soyez conscient des conseils d'une autre affiche ci-dessus: l'ordre dans lequel les lignes sont renvoyées sans clause ORDER BY est arbitraire et peut changer sans notification. Il serait préférable de modifier votre tableau si possible.

mySQL CREATE VIEW syntax

+0

À droite, par mes rêveries vers la fin de la question originale. Mais voyez ici la chose, il peut y avoir des centaines, des milliers d'entrées alors que je suis surtout intéressé par l'affichage des dernières douzaines entrées. Je pourrais utiliser des variables mysql et faire un compteur pour chaque ligne, puis envelopper ces lignes avec la requête paginée et ORDER DESC mais cela va complètement à l'encontre de l'efficacité et de ce que j'essaie spécifiquement d'éviter. –

+0

Peut-être utiliser une vue pour ajouter la clé générée si vous ne pouvez vraiment pas modifier la table d'origine. –

+0

Pourriez-vous s'il vous plaît développer sur ce Mark? Je ne suis pas familier avec le terme "vue" par rapport à mysql? –