2012-08-07 4 views
0

Ma table se compose de documents où chaque dossier a sa propre histoire qui ressemble à ceci:table de tri mysql en valeur complexe

65465406540-245|65465408540-654 

Il n'y a pas de limite aux entrées de l'histoire comptent (type de colonne est un texte, donc .. .). Et les entrées d'historique sont TOUJOURS triées du plus ancien au plus récent. Ce qui signifie que la nouvelle entrée est sur la droite.

Les entrées d'historique sont séparées par le caractère "|". Une entrée d'historique consiste en un horodatage, un tiret "-" en séparateur et un nombre de 1 à 4 chiffres représentant l'ID utilisateur ayant effectué le changement.

Maintenant, mon problème est que je voudrais trier les enregistrements dans ma table par l'entrée de l'histoire la plus récente (ou la plus ancienne). Comment ferais-je cela?

Je pensais aux fonctions de MySQL, puisque le résultat doit venir à mon script PHP déjà trié, mais je ne sais pas par où commencer, donc toute aide est très appréciée.

Répondre

1

Pour plus ancienne, vous pouvez utiliser RedFilters (maintenant expurgée) réponse

ORDER BY LEFT(column_name,11) 

Trier par le plus récent est un peu plus amusant.

ORDER BY REVERSE(SUBSTR(REVERSE(column_name),1,LOCATE("|",REVERSE(column_name))-1)) 

Décomposons cela. Nous inversons la colonne et trouvons l'index du premier |

456-04580456456|542-04560456456 

On obtient alors la sous-chaîne jusqu'à ce point qui nous donne:

456-04580456456 

Ceci est le dernier élément inversé maintenant nous pouvons simplement REVERSE la chaîne et de l'ordre par qu'ordonner le dernier article:

65465408540-654 

Ceci est assez hideux cependant. J'envisagerais de le faire en PHP si possible.

+0

J'ai peut-être mal décrire. Ce dont j'ai besoin, c'est de trier juste avant le dernier horodatage (asc/desc). Et pour cela résolu je suis vraiment reconnaissant pour la requête complexe @Jim à laquelle je viens d'ajouter ASC, ou DESC. Je vous remercie! – meridius

0

J'ai modifié la requête de Jim, de sorte qu'elle peut également fonctionner avec une seule entrée d'historique et/ou aucune et affiche uniquement l'horodatage pour faciliter les calculs de date/heure. Le voici:

SELECT *, 
    IF(
     LOCATE('|', history) > 0, 
     LEFT(
      REVERSE(
       LEFT(
        REVERSE(history), 
        LOCATE('|', REVERSE(history))-1 
       ) 
      ), 
      10 
     ), 
     LEFT(history, 10) 
    ) AS last 
FROM table 
ORDER BY last DESC