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 :

selectionner un nombre n d'enregistrements


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2004
    Messages : 282
    Points : 103
    Points
    103
    Par défaut selectionner un nombre n d'enregistrements
    Bonjour à tous,

    Est ce qu'il y a une autre façon de sélectionner un nombre bien précis d'enregistrement sans utiliser 'Limit'.

    Merci.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ca dépend du contexte et de la requête.
    Dans certains cas, ce sera possible. Dans d'autres non.

    Que veux-tu faire plus précisément ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2004
    Messages : 282
    Points : 103
    Points
    103
    Par défaut
    Merci pour votre réponse.
    Pour mon cas je voudrais calculer le nombre de point pour un club donné et cela ne se fait si le club a participé d'au moins de 4 athlètes. Exemple :

    Club Athlète classement
    C1 AT1 1
    C2 AT2 2
    C3 AT3 3
    C2 AT4 4
    C2 AT5 5
    C1 AT6 6
    C3 AT7 7
    C1 AT8 8
    C2 AT9 9
    C1 AT10 10

    Classement de clubs Nbre de point
    C2 20 (2+4+5+9)
    C1 25 (1+6+8+10)

    C3 est annulé car le nombre de participants est inférieur à 4.

    Merci pour votre aide.

  4. #4
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2004
    Messages : 282
    Points : 103
    Points
    103
    Par défaut
    Voici mon bout de code mais malheureusement, il comptabilise la somme des classements d'un club donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  c.club, sum(r.classement)
    FROM resultat r,  clubs c
    WHERE r.id_club = c.id_club 
    AND r.id_comp =  '130' 
    AND r.id_club = 13 
    GROUP BY club
    LIMIT 0 , 4
    Cette requete me retourne 64 or que normalement cela doit tourner 37.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par wperle Voir le message
    Pour mon cas je voudrais calculer le nombre de point pour un club donnée et cela ne se fait si le club a participer d'au moins de 4 athlètes.
    Ton problème n'est donc pas de prendre seulement les 4 premiers résultats par club !

    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.club, SUM(r.classement) AS Total_Points
    FROM resultat AS r
    INNER JOIN club AS c ON r.id_club = c.id_club
    WHERE r.id_comp = 130
    GROUP BY c.club
    HAVING COUNT(DISTINCT athlete) > 3
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2004
    Messages : 282
    Points : 103
    Points
    103
    Par défaut
    Ta requête fonctionne bien, mais le problème il cumule le classement de l'ensemble des athlètes qui sont plus de 4. Mais normalement je souhaiterais sélectionner les clubs qui ont participé d'au moins par 4 athlètes, et faire la somme du classement uniquement pour les 4 premiers. Car parfois un club peut participer par 9 athlètes et je dois classer ce club uniquement par ses 4 premiers athlètes.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ce n'était pas précisé dans ta demande précédente, même si c'est ce que sous-entendait le titre de ton premier message !

    En m'inspirant de cette source MySQL, je pense qu'on peut obtenir les 4 premiers par club :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.club, r.athlete, r.classement
    FROM resultat AS r
    INNER JOIN club AS c ON r.id_club = c.id_club
    WHERE r.id_comp = 130
      AND (
        SELECT COUNT(*)
        FROM resultat AS r1
        WHERE r1.id_club = r.id_club
          AND r1.classement > r.classement
      ) < 4
    ORDER BY r.id_club, r.classement
    Si j'applique ma première requête à la seconde, ça devrait te donner le résultat que tu attends :
    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
    SELECT t.club, SUM(t.classement) AS Total_Points
    FROM (
    SELECT c.club, r.athlete, r.classement
    FROM resultat AS r
    INNER JOIN club AS c ON r.id_club = c.id_club
    WHERE r.id_comp = 130
      AND (
        SELECT COUNT(*)
        FROM resultat AS r1
        WHERE r1.id_club = r.id_club
          AND r1.classement > r.classement
      ) < 4
    ORDER BY c.club, r.classement
    ) AS t
    GROUP BY t.club
    HAVING COUNT(DISTINCT t.athlete) = 4
    Si les athlètes ne peuvent participer qu'une fois à la compétition, un COUNT(*) à la dernière ligne devrait être plus performant et donner le même résultat.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2004
    Messages : 282
    Points : 103
    Points
    103
    Par défaut
    Bonjour,

    Malheureusement je n'arrive pas à sélectionner les 4 premiers enregistrements pour un club donné dans une compétition X.
    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
     
    SELECT c.club, res.id_athlete, res.cl_r as classement 
    FROM `Tpersonne` p
    INNER JOIN Tathlete a ON p.id_pers = a.id_pers
    INNER JOIN Tathlete_club r ON r.id_athlete = a.id_athlete
    INNER JOIN Tclub c ON c.id_club = r.id_club
    INNER JOIN Tresultats res ON res.id_athlete=r.id_athlete
    WHERE r.saison = '2009-2010' 
       AND res.id_comp='855'
       AND r.id_club = '159'
       AND res.categorie='Junior'
       AND p.sexe_pers='F'
       AND ( SELECT COUNT(*)
                FROM Tresultats as res1 
                WHERE res1.classement=res.classement
                AND res1.classement>res.classement )<4
    Il me sort toujours tous les athlètes participants. Ce que je souhaite c'est d'avoir un nombre exacte de 4 si c'est inférieur qu'il l'ignore si c'est plus qu'il prenne uniquement que les 4 premiers.

    Merci pour aide.

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Avant d'ajouter des tables et des jointures supplémentaires, qui vont encore complexifier la question, est-ce que la seconde requête proposée par Cinephil renvoie bien le résultat que vous attendez, pour les colonnes qu'elle contient ?

    Dans un second, seulement si la réponse à cette première question est oui, alors il nous faudrait le schéma de la base, la liste des colonnes que vous souhaitez dans la requête et, pourquoi pas, un petit exemple de données sur chaque table et de ce que vous souhaitez en sortie de requête.

    Si la requête de Cinephil ne fonctionne pas, pouvez-vous nous dire ce qui ne convient pas dans le résultat obtenu ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  10. #10
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2004
    Messages : 282
    Points : 103
    Points
    103
    Par défaut
    Merci CED,

    Je me suis référé à l'exemple de CinePhil, et j'ai essayé de l'appliquer à mon cas mais vu j'ai une architecture un peu complexe je n'arrives pas vraiment sélectionner les lignes que je veux restituer. L'architecture est la suivante :

    Tpersonne (idpers, nom, prenom, date_naissance, sexe....)
    Tathlete (idpers, idathl, carte_adhesion, idpere, idmere) pour idpere et idmere se sont aussi enregistré dans la table personne
    Tathlete_club (idathl, idclub, categorie, dateRenouvellement )
    Tclub (idclub, club )
    Tepreuve(idepr, libelle)
    Tcalendrier(idcomp, libelle, dateCompetition, typeCompetition)
    Tresultats (idathl, idcomp, idclub, idepr, performance, classement, categorieJouer) il se peut qu'un minime a joué avec les cadets

  11. #11
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Avec les vrais noms de tables, la requête de Cinephil devient :
    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
    SELECT t.club, SUM(t.classement) AS Total_Points
    FROM (
        SELECT c.club, r.idathlete, r.classement
        FROM Tresultats AS r
        INNER JOIN Tclub AS c ON r.idclub = c.idclub
        WHERE r.idcomp = 130
        AND (
            SELECT COUNT(*)
            FROM Tresultats AS r1
            WHERE r1.idclub = r.idclub
            AND r1.classement > r.classement
        ) < 4
        ORDER BY c.club, r.classement
    ) AS t
    GROUP BY t.club
    HAVING COUNT(DISTINCT t.athlete) = 4
    Déjà, est-ce que cette requête fonctionne ? Si non, quel est le message d'erreur ?
    Si oui, le résultat est-il celui attendu ? Si oui, super . Si non, qu'est-ce qui ne convient pas ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  12. #12
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Février 2004
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2004
    Messages : 282
    Points : 103
    Points
    103
    Par défaut
    Bonjour ced,

    Effectivement j'ai essayé la requête de CinePhil, cette dernière fonctionne bien. Pas de message d'erreur mais le résultat obtenu n'est pas bon.

    J'ai essayé de copier ma table résultat dans la table résultat1 et je l'ai dé normaliser pour éviter le trop de jointure donc mes tables qui restent sont les suivantes tresultat1 et tclub. le résultat est toujours le même.
    En pièce jointe la requête et le résultat obtenue.

    Pour classer un club d'abord il faut fixer la catégorie (minimes, cadet(tes), juniors, seniors) et le genre Hommes ou Dames.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Nombre maximum d'enregistrement
    Par Seth77 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 28/06/2006, 13h27
  2. [MySQL] afficher le nombre total d'enregistrements
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 21/03/2006, 22h14
  3. [MySQL] LIMIT et nombre total d'enregistrements
    Par titoumimi dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/01/2006, 11h40
  4. [MySQL] Selectionner le numéro d'un enregistrement
    Par ARRG dans le forum Langage SQL
    Réponses: 7
    Dernier message: 26/08/2005, 00h22
  5. Nombre Total d'Enregistrements d'une Requête d'Union
    Par sqlnet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/12/2003, 17h12

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