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.
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.
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 !
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.
Voici mon bout de code mais malheureusement, il comptabilise la somme des classements d'un club donnée.
Cette requete me retourne 64 or que normalement cela doit tourner 37.
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
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 !
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.
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 :
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 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 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.
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
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 !
Bonjour,
Malheureusement je n'arrive pas à sélectionner les 4 premiers enregistrements pour un club donné dans une compétition X.
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.
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
Merci pour aide.
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
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
Avec les vrais noms de tables, la requête de Cinephil devient :
Déjà, est-ce que cette requête fonctionne ? Si non, quel est le message d'erreur ?
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
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
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager