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 :

SELECT multiple, lier 2 tables et les afficher par ordre


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut SELECT multiple, lier 2 tables et les afficher par ordre
    Salut,

    je ne trouve pas de tutoriel sur mon problème (je suis preneur pour des tutos et savoir comment s'appelle ma requête), je vous explique:

    J'ai un concours à 10 places où les utilisateurs sont classés dans le concours avec leur "points".

    J'ai donc une table "concours" avec les places et les gains, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    table concours:
    place (entier)
    gain (varchar)
     
    table users:
    id (entier)
    name (varchar)
    points (entier)

    J'ai fait la requête suivante mais elle m'affiche deux fois les résultats quand il y a deux participants avec plus de 0 points:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    SELECT
     
      TBL_concours.*,TBL_users.name as name,TBL_users.points as points 
     
    FROM 
     
      TBL_concours
     
    JOIN
     
      TBL_users
     
    WHERE
     
      points>0
     
     
    GROUP BY
     
      TBL_users.name
     
    ORDER BY
     
      TBL_concours.place,points DESC
    Je souhaite évidement lister les places de 1 à 10 et classer les utilisateurs par leur points et laisser vide une place si aucun utilisateur n'a de points.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 256
    Points : 12 919
    Points
    12 919
    Par défaut
    Bonjour,
    Je ne vois aucune colonne qui permette de faire le lien entre les lignes des deux tables.
    De plus il n'y a aucun critère de jointure dans la requête, donc tu te retrouves avec un produit cartésien.

    Pour moi il te manque une table qui fasse le lien entre un concours et un utilisateur, à moins que tu ne recrées les utilisateurs à chaque concours ?

    Une fois que tu pourras faire le lien entres ces deux (ou trois ?) tables, il suffira de modifier la requête en conséquence.

    Accessoirement je vois que la liste des colonnes de la clause SELECT n'est pas en accords avec celles qui sont dans le GROUP BY.
    Je soupçonne que tu utilises MySQL, puisque les autres SGBDs auraient rejeté ta requête.
    Tu risques fort d'avoir un résultat "aléatoire" en fonction du bon vouloir de MySQL.


    Tatayo.

  3. #3
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    Merci pour votre réponse.

    De plus il n'y a aucun critère de jointure dans la requête
    C'est la le problème, j'ai d'un côté la table concours avec les colonnes id,place et gain puis de l'autre la table users avec id,name,points.

    La seule chose qui me permet de classer les users sont leur "points"

    MySQL, oui, avec PHP.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 256
    Points : 12 919
    Points
    12 919
    Par défaut
    Faire le lien sur le nombre de points n'est pas une bonne idée. Quid des exæquos ?

    Pour moi:

    1. Il te manque une table pour faire le lien entre utilisateur et concours
    2. Il te manque un id dans la table concours
    3. Il faut déplacer les points dans la table du point 1


    La table du point 1 aura donc (pour commencer) 3 colonnes:
    1. L'id du concours
    2. L'id de l'utilisateur
    3. Les points


    Récupérer les points "totaux" passera par une simple somme, donc cette donnée ne doit pas être dans la table utilisateur.
    Le mieux à moins avis est de passer par la section modélisation du forum, pour avoir des conseils plus "poussés".
    Une fois que le modèle de ta base sera "corrigé", on pourra s'occuper des requêtes.

    Tatayo.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par two3d Voir le message
    je suis preneur pour des tutos et savoir comment s'appelle ma requête
    C'est très connu dans le monde des bases de données, ça s'appelle une modélisation faite avec les pieds.

    Si vous êtes en MySQL 8+ vous pouvez recréer une place à partir du nombre de points pour faire la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with cte_users (id, name, points, place) as
    (
    select id, name, points
         , rank() over(order by points desc)
      from users
    )
      select u.id, u.name, u.points, u.place, c.gain
        from cte_users as u
        join concours  as c on c.place = u.place
    order by c.place asc;
    À noter que vous devez savoir comment gérer les ex-æquo.

  6. #6
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    Merci, ça devient compliquer pour moi mais je suis prêt à apprendre et ne pas rester en bas de l'échelle.

    Cependant je ne trouve rien sur le terme "modélisation faite avec les pieds"

    J'ai MySQL 5.7.14

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

    Je suppose et j'espère qu'il ne s'agit pas d'une base de données de production, car en effet, s'il n'y a que ces deux tables, c'est très mal conçu.
    Donc, dans la mesure du possible, plutôt que de se lancer dans des requêtes complexes, peu fiables et peu performantes il est préférable de revoir la modélisation.

  8. #8
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    C'est pas en production vue que ça ne fonctionne pas. C'est approximatif pour vous montrer ce dont j'ai besoin.

    J'aimerais juste savoir faire ce genre de requête, sinon je passe par un autre moyen comme mettre les places du concours dans un variable array PHP, listé avec un foreach puis je met tout les users classé via leur points.

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    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 338
    Points : 39 737
    Points
    39 737
    Billets dans le blog
    9
    Par défaut
    Pour pouvoir faire ce genre de requête c'est très simple, sous réserve que le modèle de données soit adapté
    A votre place j'irai faire un tour sur le forum consacré à la modélisation qui se trouve ici

    https://www.developpez.net/forums/f6...sation/schema/

    En décrivant précisément le besoin, un modèle adapté pourra être construit

  10. #10
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    Merci, j'ai posté un nouveau sujet: https://www.developpez.net/forums/d2.../#post11684161

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

Discussions similaires

  1. [MySQL] Enregistrer les valeurs d'un select multiple dans une table mysql
    Par barale61 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/04/2015, 14h58
  2. Extraction de deux valeurs d'un tableau et les afficher par ordre croissant.
    Par while.dede dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 09/03/2015, 15h27
  3. Problème de select multiples dans plusieurs tables
    Par superseb801 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/05/2007, 02h22
  4. selection multiple vers une table ajout
    Par EE dans le forum Access
    Réponses: 12
    Dernier message: 18/05/2005, 16h56
  5. select multiple sur plusieurs tables
    Par syl2095 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/12/2004, 15h48

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