IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Trier des titres de films contenant des nombres


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Trier des titres de films contenant des nombres
    Bonjour,

    j'utilise une base MySQL couplée à un site en PHP pour gérer une collection de DVD.

    J'ai une vue de la liste qui est ordonnée par ordre alphabétique des titres de films ou de séries.
    Le problème est que les nombres dans ces titres ne sont pas triés par ordre croissant numérique mais par ordre alphabétique. Ainsi, dans ce tri, 10 est avant 2 car le premier chiffre est 1, donc plus petit que 2.

    Ce n'est pas un énorme problème car les films ayant 10 opus sont rares. Mais cela arrive pour les séries.
    Ainsi, une série qui a atteint 10 saisons est triée comme cela : 1, 10, 2, 3 ...

    Y a-t-il un moyen pour que la requête de tri considère 10 comme la valeur 10 et non comme 1 0 ?
    Bien évidemment, je ne souhaite pas ajouter un 0 aux autres titres pour "tricher".

    Merci.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Le mieux serait de faire le tri coté applicatif, en utilisant un algorithme de tri naturel.

    En PHP, il doit y avoir un truc genre natsort

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Le mieux serait de faire le tri coté applicatif, en utilisant un algorithme de tri naturel.

    En PHP, il doit y avoir un truc genre natsort
    Merci pour cette réponse.

    C'est ça l'idée : appliquer un tri naturel sur les résultats de la requête.
    Cependant, un équivalent en SQL aurait été préférable car par la suite, les résultats ne sont pas gérés par un tableau.

    De plus, la requête ne retourne pas que le titre mais d'autres infos liées au DVD. Du coup, si je devais stocker ça dans un tableau, ce serait un à 2 dimensions. Or je ne vois pas comment natsort pourrait trier les données selon le titre sans toucher aux autres valeurs.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Quand on veut faire ça au niveau BDD, on rajoute une colonne qui contient la valeur à utiliser pour trier.

    Si par exemple tu as une colonne Titre qui contient les titres de 'Dallas 1' à 'Dallas 10', tu ajoutes une colonne a TitrePourTri qui contient 'Dallas 01' à 'Dallas 10'. Ensuite, tu affiches le titre normal tout en triant sur le titre technique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Titre
    FROM Series
    ORDER BY TitrePourTri
    Pour raffiner, tu peux créer une fonction qui détermine le titre pour tri à partir du titre normal, et des triggers qui le mettent à jour.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Quand on veut faire ça au niveau BDD, on rajoute une colonne qui contient la valeur à utiliser pour trier.

    Si par exemple tu as une colonne Titre qui contient les titres de 'Dallas 1' à 'Dallas 10', tu ajoutes une colonne a TitrePourTri qui contient 'Dallas 01' à 'Dallas 10'. Ensuite, tu affiches le titre normal tout en triant sur le titre technique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Titre
    FROM Series
    ORDER BY TitrePourTri
    Pour raffiner, tu peux créer une fonction qui détermine le titre pour tri à partir du titre normal, et des triggers qui le mettent à jour.
    Mouais...
    Ça revient à tricher, comme je disais plus haut.
    Si c'est ajouter un champ à la table pour toutes les entrées, c'est pas super économique en ressources, bien que je convienne que cela fonctionne.

    Pour la "triche" j'ai déjà ajouté une espace avant le chiffre. arrive avant et à l'affichage en HTML, on ne voit qu'une seule espace.

    Je voulais une fonction qui soit utilisable directement. Je voudrais éviter de devoir prévoir ce cas de figure pour 100% de la base ou devoir anticiper ou corriger les saisons 1 à 9 si la série atteint les 10.

    Mais si c'est pas possible en SQL et que le PHP nécessite des tableaux, je vais en rester à ma bidouille.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    La triche est déjà derrière vous !
    Elle a été commise quand vous avez inclus, dans votre modèle, le numéro dans le titre.
    Si vous aviez eu une colonne séparée, de type numérique, le problème ne se poserait pas : il suffirait de trier par (titre, version).

    à moins de corriger ce problème, il ne vous reste en effet que la bidouille. Le tri naturel me semble la meilleure solution, mais préférable coté PHP et je ne comprend pas votre réticence à précéder ainsi : il vous suffit de trier le résultat que vous récupérez en php. Ce tri pourrait même être fait en javascript coté client.

    Si vous tenez vraiment à le faire coté SQL, vous pouvez écrire une fonction qui remplace :
    0 -> A
    1 -> B
    ...
    10 -> L
    12 -> M
    ...

    en commençant bien sûr par la fin pour ne pas remplacer 10 par AB.
    Vous pourrez alors trier selon le résultat de cette fonction, mais qui aura non seulement une limite, mais sera également consommatrice de ressources sur le serveur SQL
    là pour le coup, on est vraiment dans la bidouille

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 142
    Points : 38 924
    Points
    38 924
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    La triche est déjà derrière vous !
    Elle a été commise quand vous avez inclus, dans votre modèle, le numéro dans le titre.
    Si vous aviez eu une colonne séparée, de type numérique, le problème ne se poserait pas : il suffirait de trier par (titre, version).
    Et oui, les erreurs de modélisation se payent cash au quotidien.
    Il est préférable dans la mesure du possible (les progiciels ne le permettent que rarement) de corriger le modèle, plutôt que de pénaliser tous les traitements et/ou d'avoir des résultats faux ou incomplets

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    C'est votre modèle de données qui n'est pas bon.
    Vous violez la première forme normale !

    Une relation est dite normalisée (ou en «première forme normale» notée 1NF) si chaque valeur d'attribut est atomique (c'est-à-dire n'est pas un ensemble ou une liste) ; tout attribut d'une relation 1NF doit donc être monovalué.
    Extrait de FSMREL : Bases de données relationnelles et normalisation : de la première à la sixième forme normale

    En mettant dans votre titre 2 éléments :
    • le titre
    • le n° d'épisode


    Vous avez violé la 1FN !

    Si vous aviez modéliser correctement vous auriez 2 colonnes, l'une VARCHAR, l'autre INT et le tri serait toujours correct.

    En sus vous allez avoir des difficultés pour les requêtes de recherche si vous persistez dans votre modèle anormal.

    Par exemple pour trouver ce titre il vous faudra faire un LIKE dans votre modèle alors qu'un simple = est suffisant si vous dissociez les deux !

    Et donc les performances seront moins bonne à dégueulasse !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Vous avez violé la 1FN !
    Tu crois qu'elle va porter plainte ?

    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    @aieeeuuuuu
    Merci pour ces précisions.

    Concernant le titre, je ne suis pas tout à fait d'accord : dans le cas des séries, OK, le numéro de saison pourrait être dans un champ à part mais dans le cas des films, cela fait bien partie du titre. Dans "Machin 4 : le retour du frère de la vengeance", on ne peut retirer le numéro pour le stocker à part. Le laisser ET le stocker à part à la limite...

    Pour le PHP, c'est la mise en œuvre que je ne vois pas bien.
    Ne récupérant pas un tableau, il faudrait que je stocke les résultats de la requête dans un tableau de tableaux. Chaque résultat (fiche DVD) représentant un tableau lui-même stocké dans un autre contenant tous les résultats.
    Du coup, je ne vois pas comment natsort pourrait trier les résultats selon le champ "titre" en conservant l'association du titre aux autres champs de la fiche.

    Pour le champ modifié en SQL afin de reproduire le tri naturel, ce n'est pas viable non plus. C'est de la bidouille aussi mais plus hard qu'une simple espace en plus. D'autant que pour que le système fonctionne, il faudrait en théorie prévoir tous les nombres, pas seulement jusqu'à 10. Il faudrait alors choisir une limite arbitraire en misant sur le fait que la majorité des séries/films ne dépassent pas le numéro XX. Où placer cette limite ? On est déjà au James Bond N°23 (bientôt 24...) .

    Je vais en rester pour le moment à ma bidouille avec les espaces.

    Il est clair que le modèle n'est plus adapté à mon utilisation actuelle.
    Cependant, @SQLpro, inutile d'écrire en rouge ou en gros. Je n'ai jamais prétendu que le modèle était parfait et qu'il relevait d'une importance vitale pour une grosse société.
    C'est une base perso qui gère une simple liste de DVD, je survivrai. Si les fonctions de tri naturel existent c'est bien que cela est nécessaire dans certains cas.
    De plus, quand vous "violez" l'orthographe, je ne vous l'écris pas en rouge.

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Duke3DVD Voir le message
    Pour le PHP, c'est la mise en œuvre que je ne vois pas bien.
    Ne récupérant pas un tableau, il faudrait que je stocke les résultats de la requête dans un tableau de tableaux. Chaque résultat (fiche DVD) représentant un tableau lui-même stocké dans un autre contenant tous les résultats.
    Du coup, je ne vois pas comment natsort pourrait trier les résultats selon le champ "titre" en conservant l'association du titre aux autres champs de la fiche.
    Vous effectuez plusieurs requête en boucle (une par fiche DVD) ?

    quoi qu'il en soit, ça me semble à la portée de PHP que de trier un tableau (même à trois dimensions) sans y perdre ses petits.
    N'hésitez pas à poster sur le forum PHP si besoin.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Vous effectuez plusieurs requête en boucle (une part fiche DVD) ?
    Non, je passe une requête me donnant toutes les fiches correspondantes.
    Je récupère ensuite les données avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @mysql_result($result,$compteur,'nom_du_champ');
    .

    Si je modifie ma base en y ajoutant le numéro d'opus, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY 'titre', 'opus'
    suffira, pour les films comme pour les séries.

    Pour être totalement transparent, le problème ne se pose actuellement que pour la saison 10 de Stargate SG-1 sur un total de 402 titres et 10 ans d'existence de ce site. Un titre représentant une boite de DVD, soit une saison entière dans le cas de SG-1. D'où ma fainéantise et ma recherche d'une fonction toute simple pour trier mes champs existants.

    Merci encore.

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Duke3DVD Voir le message
    Concernant le titre, je ne suis pas tout à fait d'accord : dans le cas des séries, OK, le numéro de saison pourrait être dans un champ à part mais dans le cas des films, cela fait bien partie du titre. Dans "Machin 4 : le retour du frère de la vengeance", on ne peut retirer le numéro pour le stocker à part. Le laisser ET le stocker à part à la limite...
    Dans ce cas vous violez à nouveau la 1FN :
    1) le litre : "Machin"
    2) le numéro : 4
    3) le sous titre ou titre de l'épisode : "le retour du frère de la vengeance"

    Donc 3 attributs !

    C'est le type même d'exercice que je donne à mes élèves ingénieurs !

    Concernant l'orthographe, je suis dyslexique... Je n'y peut rien, ça se soigne pas et sa progresse en vieillissant...
    Mais vous avez raison, il faut savoir appuyer là ou ça fait mal, ça permet de changer de discours quand on est à cours d'arguments !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Mais vous avez raison, il faut savoir appuyer là ou ça fait mal, ça permet de changer de discours quand on est à cours d'arguments !
    Non, je voulais juste vous faire remarquer l'agressivité disproportionnée de votre message.

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Duke3DVD Voir le message
    Non, je voulais juste vous faire remarquer l'agressivité disproportionnée de votre message.
    Je rigole.... Mais je ne suis plus, depuis très longtemps adpete du consensus mou et du politiquement correct. Bref, quand c'est de la merde, je ne dit pas "c'est une substance brunâtre et molle à l'odeur nauséabonde", mais "c'est de la merde" tout simplement ! Si vous prenez cela pour de l'agressivité, tant mieux... Peut être que cela pénétrera plus vite dans votre cerveau ! C'est d'ailleurs le but cherché !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  16. #16
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Citation Envoyé par Duke3DVD Voir le message
    Non, je voulais juste vous faire remarquer l'agressivité disproportionnée de votre message.
    SQLpro réagit toujours comme ça . Il ne faut pas le prendre personnellement.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/03/2013, 13h26
  2. Réponses: 2
    Dernier message: 26/01/2012, 02h38
  3. Réponses: 31
    Dernier message: 19/09/2011, 10h37
  4. Réponses: 8
    Dernier message: 29/10/2008, 18h02
  5. Réponses: 3
    Dernier message: 01/08/2006, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo