Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 11/03/2010, 11h15   #1
Futur Membre du Club
 
Femme
Inscription : février 2004
Messages : 114
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : février 2004
Messages : 114
Points : 15
Points : 15
Envoyer un message via Yahoo à wperle
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.
wperle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 11h47   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur développement logiciels
Inscription : août 2006
Messages : 10 048
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 048
Points : 16 346
Points : 16 346
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 12h19   #3
Futur Membre du Club
 
Femme
Inscription : février 2004
Messages : 114
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : février 2004
Messages : 114
Points : 15
Points : 15
Envoyer un message via Yahoo à wperle
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.
wperle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 13h56   #4
Futur Membre du Club
 
Femme
Inscription : février 2004
Messages : 114
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : février 2004
Messages : 114
Points : 15
Points : 15
Envoyer un message via Yahoo à wperle
Voici mon bout de code mais malheureusement, il comptabilise la somme des classements d'un club donnée.

Code :
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.

Dernière modification par CinePhil ; 11/03/2010 à 14h02. Motif: Balises codes en remplacement de quote
wperle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 14h08   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur développement logiciels
Inscription : août 2006
Messages : 10 048
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 048
Points : 16 346
Points : 16 346
Envoyer un message via MSN à CinePhil
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 15h19   #6
Futur Membre du Club
 
Femme
Inscription : février 2004
Messages : 114
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : février 2004
Messages : 114
Points : 15
Points : 15
Envoyer un message via Yahoo à wperle
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.
wperle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 16h05   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur développement logiciels
Inscription : août 2006
Messages : 10 048
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 048
Points : 16 346
Points : 16 346
Envoyer un message via MSN à CinePhil
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 :
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2010, 15h35   #8
Futur Membre du Club
 
Femme
Inscription : février 2004
Messages : 114
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : février 2004
Messages : 114
Points : 15
Points : 15
Envoyer un message via Yahoo à wperle
Bonjour,

Malheureusement je n'arrive pas à sélectionner les 4 premiers enregistrements pour un club donné dans une compétition X.
Code :
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.

Dernière modification par wperle ; 16/03/2010 à 17h05.
wperle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 15h43   #9
ced
Rédacteur/Modérateur
 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 777
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 777
Points : 6 207
Points : 6 207
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 16h12   #10
Futur Membre du Club
 
Femme
Inscription : février 2004
Messages : 114
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : février 2004
Messages : 114
Points : 15
Points : 15
Envoyer un message via Yahoo à wperle
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
wperle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2010, 18h05   #11
ced
Rédacteur/Modérateur
 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 777
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 777
Points : 6 207
Points : 6 207
Avec les vrais noms de tables, la requête de Cinephil devient :
Code :
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 12h37   #12
Futur Membre du Club
 
Femme
Inscription : février 2004
Messages : 114
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : février 2004
Messages : 114
Points : 15
Points : 15
Envoyer un message via Yahoo à wperle
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
Type de fichier : doc requet_resultat.doc (65,5 Ko, 2 affichages)
wperle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 10h51.


 
 
 
 
Partenaires

Hébergement Web