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

PHP & Base de données Discussion :

PDO base de donnée requête SQL


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de XAVIERV
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut PDO base de donnée requête SQL
    Bonsoir à tous,
    Suite à un énoncé de devoir, j'ai crée quatre tables dans la base dbdevoir:

    - table ecoles: id/école A, école B, école C
    -table eleves: id/nom/écoles
    -table sports: id/boxe, judo, football, natation, cyclisme
    -table sports_eleves: eleves:id/ eleves_id/ sport_id la table contient plusieurs fois certains élèves avec plusieurs sports ajoutés

    Mon but et de compter le nombre d'élèves fessant au moins un sport pour cela j'ai crée se petit script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $dbh = new PDO('mysql:host=localhost;dbname=dbdevoir','root','');
    $stmnt=$dbh->prepare(' SELECT DISTINCT eleves_id,count(*) FROM eleves_sports GROUP BY eleves_id ');
    $stmnt->execute();
    while($count_eleves_sports = $stmnt->fetch())
    {
    	if($count_eleves_sports[1] > 1)
    {
    	$result[] = $count_eleves_sports[1];
    	$count_nombre_de_lettres = count($result);
    echo strval($count_nombre_de_lettres);
    Ceci dit je n'arrive pas à compter au final le nombre de personne fesant du sport, se script me donne le résultat 12345678, le script donne bien le bon chiffre de personne fesant du sport cependant elle ne me dit pas juste 8, je me demande si cela ne serai pas possible de trouvé la solution avec une requête SQL ! merci de votre aide

  2. #2
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    1- Je ne savais pas que la fessée était un sport...

    Citation Envoyé par XAVIERV Voir le message
    ...compter le nombre d'élèves fessant au moins un sport...


    2- à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "SELECT 
    	DISTINCT E.eleves_id,
    	(SELECT COUNT(*) FROM eleves_sports E2 WHERE E2.eleves_id = E.eleves_id ) as nombre
    	FROM eleves_sports E
    	GROUP BY eleves_id";
     
    $stmnt=$dbh->prepare( $sql );

  3. #3
    Membre averti Avatar de XAVIERV
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut
    lol ,Merci beaucoup de prendre le temps de m'aider, du coup depuis toute à l'heure j'essaye de faire marcher cette requête mais je pense que je bloque sur AS nombre dans la requête. et du coup j'ai un peu retravaillé la requête comme je connais mais cela ne marche toujours pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT COUNT(*), FROM eleves_sports AS ES INNER JOIN eleves AS E ON ES.eleves_id = E.id GROUP BY eleves_id.ES


    Je viens de faire marché la requête que tu ma écrit et elle me donne que 1 pour résultat
    il faudrait surement la comparer avec >1


    Serai t'il possible de me donner ta solution pour afficher le résultat merci <3, car peux être que je n'utilise pas la bonne méthode.

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 319
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 319
    Billets dans le blog
    17
    Par défaut
    Mon but et de compter le nombre d'élèves fessant au moins un sport
    Ceci devrait suffire :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ALL COUNT(DISTINCT eleve_id)
    FROM sports_eleves

  5. #5
    Membre averti Avatar de XAVIERV
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut
    Ceci me donne le résultat du nombres d'éléves qui est 20, j'ai 8 éléves qui font plus de 1 sport dans ma table eleves_sports.

  6. #6
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Montre ta TABLE sports_eleves (structure et données), qu'on puisse tester.

  7. #7
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 319
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 319
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par XAVIERV Voir le message
    Ceci me donne le résultat du nombres d'éléves qui est 20, j'ai 8 éléves qui font plus de 1 sport dans ma table eleves_sports.
    Ben, tu as demandé le nombre d'élèves qui font AU MOINS 1 sport, c'est ce que donne ma requête.

    Si tu veux le nombre d'élèves qui font au moins 2 sports :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ALL COUNT(*)
    FROM (
        SELECT ALL eleve_id
        FROM sports_eleves
        GROUP BY eleve_id
        HAVING COUNT(DISTINCT sport_id) >= 2
    ) AS _

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    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 599
    Billets dans le blog
    10
    Par défaut
    Bonjour Xavierv

    Quelques remarques relatives au modèle de données

    Citation Envoyé par XAVIERV Voir le message
    Suite à un énoncé de devoir, j'ai crée quatre tables dans la base dbdevoir:
    - table ecoles: id/école A, école B, école C
    -table eleves: id/nom/écoles
    -table sports: id/boxe, judo, football, natation, cyclisme
    -table sports_eleves: eleves:id/ eleves_id/ sport_id la table contient plusieurs fois certains élèves avec plusieurs sports ajoutés
    D'une façon générale, on ne nomme pas les tables au pluriel, il est évident que chaque table peut contenir plusieurs occurrences d'écoles, d'élèves etc.
    Donc "ECOLE" plutôt que "ECOLES", "ELEVE" plutôt que "ELEVES"...

    Ensuite, dans une table, le même attribut ne doit pas être répété. Ainsi, "Ecole A", "Ecole B" et "Ecole C" est une erreur de modélisation.
    Idem dans la table des sports.
    Si demain vous avez besoin de gérer plus d'écoles, vous êtes contraints de modifier votre table, c'est ballot.
    Et si dans certains cas vous n'avez qu'une ou deux écoles, les autres colonnes inutiles seront marquées "nul".
    Enfin et surtout, l'identifiant ne correspond donc a rien puis qu'il est unique pour 3 écoles différentes, et ça, c'est tout le contraire du rôle d'un identifiant qui doit permettre de reconnaitre de façon certaine l'occurrence qu'il identifie.

    Par ailleurs, pour éviter les homonymes tels que "id" présent dans toutes les tables et dont on ne sait ce qu'il représente, j'aime bien utiliser un préfixe ou un suffixe pour chaque table et chaque attribut. Ce qui donne par exemple :
    EC_ECOLE(EC_id, EC_nom, EC_numero_agrement, etc.)
    EL_ELEVE(EL_id, EL_matricule, EL_nom, EL_prenom, EL_ddn, etc.)
    SP_SPORT(SP_id, SP_code, SP_nom, etc.)
    SE_SPORT_ELEVE(SP_id#, EL_id#, SE_date_deb, SE_date_fin, etc.)
    Ainsi, on voit tout de suite d'où viennent les FK de la table associative SE_SPORT_ELEVE

  9. #9
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    @escartefigue

    1- "Ecole A", "Ecole B", "Ecole C" sont en réalité des exemples pour la colonne "nom" de la table ecoles.

    • -> voir le fichier zip (cf. message #9)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `ecoles` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `nom` varchar(1) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
     
    INSERT INTO `ecoles` (`id`, `nom`) VALUES
    (1, 'A'),
    (2, 'B'),
    (3, 'C');
    Idem pour boxe, judo, football, natation, cyclisme,...

    2- Néanmoins, je plussois ta conception des noms de tables et colonnes, avec préfixes.
    Bien que, perso, j'écris tout en minuscules.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    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 599
    Billets dans le blog
    10
    Par défaut
    ah ok

    heureusement qu'il s'agit d'un exemple, sinon varchar(1)

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

Discussions similaires

  1. [XL-2007] Base de donnée requête SQL VBA
    Par jopont dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 03/03/2015, 11h00
  2. Connexion bases de données C++/SQL Server
    Par Essedik dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 09/06/2008, 11h50
  3. intégrer une base de donnée dans sql server
    Par gock dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 11/01/2006, 23h27
  4. exo base de donnée avec SQL
    Par chti_juanito dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/11/2005, 16h02
  5. probleme avec une base de donnée postgres SQL
    Par Alexlesilex dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/06/2005, 22h09

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