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

Langage SQL Discussion :

Comment réduire ma table ou écrire cette requête en une seule fois ?


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut Comment réduire ma table ou écrire cette requête en une seule fois ?
    Bonjour

    J ai une base de données d'arrivées de courses pmu. J ai 3 lignes pour une même course, une pour le cheval arrivé en 1, l autre pour le cheval arrivé en 2 et une pour le cheval arrivé en 3.
    Chaque ligne contient les rapports pour les 3 chevaux.
    Il serait plus simple de n avoir qu une seule ligne avec les 3 chevaux suivis des 3 rapports.
    Est il possible de réduire cette table en en construisant une d après une requête ?

    Mon idée est de faire un select distinct dte,r,c et de boucler dessus pour en extraire les résultats, les filtrer pour n avoir qu une seule fois le nombre de partants par exemple et les insérer dans une nouvelle table (le tout en php.
    Mais je me dis que plus tôt que de boucler sur les résultats il devrait être possible de ne faire qu une seule requête ...
    J ai une table qui a cette structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE TABLE IF NOT EXISTS `arrivees` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `dte` date NOT NULL,
      `R` int(11) NOT NULL,
      `C` int(11) NOT NULL,
      `N` int(11) NOT NULL,
      `partants` int(11) NOT NULL,
      `Place` int(11) NOT NULL,
      `PMat` decimal(5,1) NOT NULL,
      `P10` decimal(5,1) NOT NULL,
      `G` decimal(5,2) DEFAULT NULL,
      `P1` decimal(4,1) DEFAULT NULL,
      `P2` decimal(4,1) DEFAULT NULL,
      `P3` varchar(4) DEFAULT NULL,
      PRIMARY KEY (`id`)
    )
    dte = date du jour de la course
    R = reunion
    C = Course
    N = Numero du cheval
    Partants = le nombre de partants de la course
    Place = Place à l arrivée (j ai que les 3 1ers)
    PMat = cote du matin
    P10 = Cote 10 minutes avant la course
    G = Le rapport du cheval joué gagnant
    P1,P2,P3 = les rapports pour les places 1,2 et 3

    Je débute et imagine peut être trop de possibilités au langage sql mais des pistes seraient les bienvenues.
    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Citation Envoyé par Debutant_pc Voir le message
    J ai une base de données d'arrivées de courses pmu. J ai 3 lignes pour une même course, une pour le cheval arrivé en 1, l autre pour le cheval arrivé en 2 et une pour le cheval arrivé en 3.
    Chaque ligne contient les rapports pour les 3 chevaux.
    Il serait plus simple de n avoir qu une seule ligne avec les 3 chevaux suivis des 3 rapports.
    Cette solution ne présente pas d'intérêt. Une ligne par concurrent permet de stocker non seulement les trois premiers, mais aussi tous les autres concurrents d'une course jusqu'au dernier. Si vous avez une seule ligne, ça n'est plus possible. En outre, si une course a deux 3e ex-aequo, votre proposition ne permet pas de stocker le résultat.
    Le jour où on vous demandera de restituer les résultats des 5 permiers (ex : le quinté dans l'ordre), votre structure actuelle le permet alors que votre proposition ne le permet pas
    À ne pas faire donc



    Citation Envoyé par Debutant_pc Voir le message
    Est il possible de réduire cette table en en construisant une d après une requête ?
    Encore moins, dupliquer les données crée une redondance au risque d'avoir des données incohérentes, conservez votre structure actuelle avec une ligne par concurrent



    Citation Envoyé par Debutant_pc Voir le message
    Mon idée est de faire un select distinct dte,r,c et de boucler dessus pour en extraire les résultats, les filtrer pour n avoir qu une seule fois le nombre de partants par exemple et les insérer dans une nouvelle table (le tout en php.
    Mais je me dis que plus tôt que de boucler sur les résultats il devrait être possible de ne faire qu une seule requête ...
    C'est exactement ce qu'il ne faut pas faire. Les SGBD relationnels sont d'autant plus performants que les requêtes sont ensemblistes. Extraire les lignes une à une dans une boucle et consolider les résultats ne présente aucun intérêt et plombe les performances. Oubliez les curseurs et autres boucles autant que faire se peut. Le résultat peut être obtenu en une seule fois.



    Communiquez la description exacte de la table existante et un exemple de résultat attendu, il sera facile de proposer une requête qui satisfasse le besoin

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Le problème c'est qu'il n'y a qu'une table alors qu'il devrait y en avoir (au moins) deux.

    D'un côté, il y a la course :
    dte = date du jour de la course
    R = reunion
    C = Course
    Partants = le nombre de partants de la course
    G = Le rapport du cheval joué gagnant
    De l'autre, il y a les chevaux à l'arrivée.
    N = Numero du cheval
    Place = Place à l arrivée (j ai que les 3 1ers)
    PMat = cote du matin
    P10 = Cote 10 minutes avant la course
    P1,P2,P3 = les rapports pour les places 1,2 et 3
    Il ne reste plus qu'à ajouter un identifiant à la course et faire référence à cet identifiant sur les arrivées.

    On n'a plus de redondance et une structure évolutive :
    On peut sans problème gérer les quartés et quintés.
    On pourrait ajouter une table des chevaux pour pouvoir suivre leurs performances et leurs cotes.
    ...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Effectivement, ne n'avais pas fait attention aux attributs, il semble que certains d'entre-eux soient ceux de la course et non des partants (en tout cas dte et partants) auquel cas il faut bien sur créer une table pour la course avec les autres attributs manquants (FK identifiant l'hypodrome par exemple)

    Attention aux noms des attributs, sans tomber dans le verbeux, R, C et N c'est quand même assez obscur...

    Faites aussi attention au typage des attributs.
    Un classement avec des décimales pas d'intérêt, et decimal (3,0) suffira largement pour une course de chevaux
    Un classement de type varchar non !

  5. #5
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Merci pour vos réponses.

    Je vais donc restructurer ma base et reviendrais ici si je n y parviens pas.

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    La restructuration qui me semble effectivement une bonne chose : éviter notamment que plusieurs chevaux d'une même course partent à des heures différentes ça peut être pas mal.

    En revanche, pour simplifier les lectures et analyses, je comprend aussi parfaitement le besoin d'avoir les données toutes à plat, avec le tiercé dans l'ordre sur une seule ligne.

    Dans ce cas, ce que vous cherchez à faire, c'est ce qu'on appelle une vue : les données ne sont pas stockées, mais cela permet d'interroger plus aisément les données.

    En revanche, attention à bien gérer le cas d'ex-equos : ça peut vite devenir bordelique... je ne connais pas assez le tiercé pour savoir si c'est possible ?
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Effectivement des ex-æquo peuvent être possible à toutes les places. C est plus fréquent que l on ne le pense dans les courses en général, enfin c est pas hyper exceptionnel...
    Si seulement un cheval avait l idée de tirer la langue sur la ligne finish ça éviterait bien des complications à qui veut traiter les 3 premiers arrivés qui peuvent être bien plus...

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

Discussions similaires

  1. Comment écrire cette requête sans le GROUP BY
    Par ghazi135 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/03/2019, 15h08
  2. Comment écrire cette requête ?
    Par Taxan dans le forum SQL
    Réponses: 15
    Dernier message: 10/11/2012, 09h43
  3. [AC-2003] comment écrire cette requête sous sql?
    Par NANOUSUN dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 27/10/2009, 21h13
  4. [MySQL] requête select une seule fois
    Par speedylol dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/02/2009, 06h40
  5. [SQL] Comment feriez-vous cette requête pour une recherche ?
    Par Core8 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/02/2008, 11h58

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