Pb requête SQL PHP

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Pb requête SQL PHP

Par yaalo  -  18 reponses  -  Le 04/01/2016 19:20  -  Editer  - 

Bonsoir à tous,
Voilà je suis bloqué sur une requête sql que voici

SELECT COUNT(id) AS CPs,module FROM ny6dh_man_eleve A,ny6dh_man_modules B
WHERE id_etat= 1
AND id_categorie= 1
AND A.mod1= 1
AND B.id_modul IN ( A.id_mod1, A. id_mod2)
AND A.mod2= 1

Je veux afficher les modules et le nombre d'élèves inscrits sur chaque modules.
J'ai une table élève et une autre module, je fais la jointure comme on peut le voir à l'aide des id et affiche donc le nom du module.
Je vérifie également que mod1 et mod2 soit sur 1.
id_etat et id_categorie sont pour d'autres critères mais utiles ici....le pb est que la requête fonctionne uniquement en présence de mod1 mais lorsque je veux étendre la requête avec mod2 j'ai toujours le même premier résultat de la première requête....vous avez une idée d'où cela peut clocher ?

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 04/01/2016 20:48  -  Haut de page  - 

Salut,
en fait c'est la clause IN qui pose problème. Il faut séparer un peu les choses en mettant une alternative. C'est pas évident d'expliquer de façon claire, alors voici ce que j'essayerais, ne connaissant pas la structures des données, je ne garantis pas que ça marchera, mais le contraire me surprendrais un peu quand même :

    SELECT  
      COUNT(id) AS CPs,  
      module  
    FROM ny6dh_man_eleve    A,  
         ny6dh_man_modules  B  
    WHERE (  
        (  
              B.id_modul = A.id_mod1  
          AND A.mod1     = 1  
        ) OR (  
              B.id_modul = A.id_mod2  
          AND A.mod2     = 1  
        )  
      )  
      AND id_etat       = 1  
      AND id_categorie  = 1;  

Il y aurait aussi une autre manière de faire une jointure en utilisant une forme normalisée, mais on va déjà voir si ça fonctionne sous cette forme.

 
Par yaalo  -  Le 05/01/2016 12:58  -  Haut de page  - 

Merci pour cette requête mais j'ai en résultat un seul des deux modules et le nombre total d'élèves inscrits aux deux modules.
Il me faudrait 2 compteurs "CPs" pour les élèves inscrits dans le module 1 et dans le module 2.

 
Par Cyrano  -  Le 05/01/2016 13:25  -  Haut de page  - 

Il faudrait me montrer un exemple de résultat attendu parce que je ne suis pas certain de l'interprétation qu'il faut faire de la question.

Ceci étant, il y a un COUNT dans la requête, ce serait compatible avec une clause GROUP BY qui en l'occurrence n'est pas utilisée, mais qui pourrait accessoirement fausser une autre partie du résultat... donc là, je ne peux pas indiquer de chemin vers la bonne solution.

 
Par yaalo  -  Le 05/01/2016 14:25  -  Haut de page  - 

Voici un exemple de résultat attendu avec les explications entre parenthèses :

CPs
2 (résultat du nombre d'élèves inscrits dans le module 1)
2 (résultat du nombre d'élèves inscrits dans le module 2)
module
Orthographe (résultat pour le module 1)
Grammaire (résultat pour le module 2)

 
Par Cyrano  -  Le 05/01/2016 15:53  -  Haut de page  - 

Ok, je suppose que le résultat devrait ressembler à ceci :

+-----+-------------+
| CPs | module      |
+-----+-------------+
|   2 | Orthographe |
|   2 | Grammaire   |
+-----+-------------+

Là où ça coince, c'est que par rapport à la requête SQL de départ, je ne comprends pas la structure de la table ny6dh_man_eleve : on dirait qu'il y a plusieurs clés étrangères et/ou plusieurs clés primaires. Est-ce qu'il serait possible de m'indiquer un DESC des deux tables en m'indiquant quelles sont les clés primaires et étrangères ?

 
Par yaalo  -  Le 06/01/2016 10:16  -  Haut de page  - 

Bonjour quelle est la requête pour obtenir un DESC merci

 
Par Cyrano  -  Le 06/01/2016 10:32  -  Haut de page  - 

Hé Yaalo, je ne suis pas cartomancien, donc si tu ne poses pas des questions complètes, tu ne pourras pas obtenir de réponse du tout. Sois donc plus précis dans la question en donnant les détails nécessaires à ce que le lecteur comprenne au moins de quoi on parle.

 
Par yaalo  -  Le 06/01/2016 12:17  -  Haut de page  - 

"Est-ce qu'il serait possible de m'indiquer un DESC des deux tables"
Voici la demande que tu as formulé

"Bonjour quelle est la requête pour obtenir un DESC merci "
Et voici ma question, donc à toi cher ami de préciser ce dont tu recherche ;-)

 
Par yaalo  -  Le 06/01/2016 12:19  -  Haut de page  - 

Pour info
"La cartomancie est un art divinatoire utilisant le tirage des cartes : divination par les cartes ou carto-mancie."

Je savais pas merci Google lol

 
Par Cyrano  -  Le 06/01/2016 12:27  -  Haut de page  - 

Ok, je sens que ça va être laborieux.

Tu n'as pas répondu du tout, et donc pour t'aiguiller vers la solution, ça va poser un problème majeur.

Le premier point, c'est que j'ai demandé un descriptif des deux tables, peut-être ne sais-tu pas faire ça, mais si tu ne me le dis pas, je ne le devinerai pas. Pour construire une requête SQL, il est absolument indispensable de connaitre la structure des données dans un schéma, ou, formulé autrement, maitriser le modèle de données, comment sont structurées les données, donc les tables, et quelles colonnes dans quelles tables.
Si tu ouvres une invite de commande mysql, tu tapes :

DESC nom_de_la_table;

Et ça devrait afficher un tableau décrivant toutes les colonnes de la table en question.
En voyant ce tableau, je pourrai avoir une idée de l'organisation des données. À la rigueur, tu pourrais aussi faire :

SHOW CREATE TABLE nom_de_la_table\G

Et à partir de là, j'aurai même davantage d'informations sur les relations entre les tables s'il y en a.

Est-ce que la question est plus claire de cette manière ?

 
Par yaalo  -  Le 06/01/2016 12:42  -  Haut de page  - 

Pour expliquer,
J'ai ma table principale élève avec en clé primaire l'id.
J'ai différentes tables dont modules,catégorie. Je fais la jointure de ces tables à l'aide d'un id (module), pour la catégorie la jointure n'est pas nécessaire pour cette requête, simplement un '1' pour la catégorie 1.

J'ai donc besoin d'afficher le nombre d'élèves inscrits dans un module donné (mod1,mod2,...) et l'intitulé de ce module.
J'ai besoin d'afficher tous les modules et le nombre dans chaques modules...je sais afficher sans problèmes le module (intitulé) + le nombre d'élèves avec cette requête :
SELECT COUNT(id) AS CPs,module FROM ny6dh_man_eleve A,ny6dh_man_modules B
WHERE id_etat= 1
AND id_categorie= 1
AND mod1= 1
AND id_mod1=id_modul
Mais cela voudrait dire que je fais cette requête pour chaque modules, ce qui est débile....

 
Par yaalo  -  Le 06/01/2016 13:09  -  Haut de page  - 

J'ai un début de piste en ajoutant un GROUP by, j'ai bien les modules en liste mais le "compteur" reste à 1
SELECT COUNT(id) AS CPs,module FROM ny6dh_man_eleve A,ny6dh_man_modules B
WHERE id_etat= 1
AND id_categorie= 1
AND mod1= 1
AND B.id_modul IN ( A.id_mod1, A. id_mod2)
AND mod2= 1
GROUP BY module

Ps:Pour la requête demandée je n'ai pas accès à mon pc et fait sur mon téléphone donc je ne peux pas coller le résultat de la requête tout se mets en ligne.

 
Par Cyrano  -  Le 06/01/2016 13:19  -  Haut de page  - 

Ok, alors je vais attendre que tu puisses poster à partir d'un PC avec un vrai clavier et la possibilité de faire une mise en forme lisible.

Mais je persiste à dire : il me faut la description de la structure des deux tables. Il y a dans la requête une ligne qui me gratte pas mal et que je ne pourrai pas résoudre tant que je ne saurai pas à quoi ça correspond.

 
Par yaalo  -  Le 06/01/2016 15:53  -  Haut de page  - 

Quelle est cette ligne qui te gratte

 
Par Cyrano  -  Le 06/01/2016 15:57  -  Haut de page  - 

Celle-ci :

 AND B.id_modul IN ( A.id_mod1, A. id_mod2)

L'utilisation du IN sur deux colonnes me parait sujette à caution

 
Par yaalo  -  Le 06/01/2016 16:07  -  Haut de page  - 

En clair je veux faire
id_modul = id_mod1
Et également
id_modul = id_mod2

id_modul est l'id du module présent dans la table module
id_mod1,id_mod2 sont les id des modules mais dans la table élève.

En amont dans le formulaire, l'élève coche les modules dont il veut s'inscrire et le submit envoi un 1 dans id_mod1 pour le choix du module 1 et un 2 dans id_mod2 pour le choix du module 2.
Sachant que les intitulés de ces modules sont dans la table module et que j'ai besoin d'afficher ces intitulés, je fais la jointure entre l'id module de la table élève et celui de la table module.

 
Par Cyrano  -  Le 06/01/2016 16:47  -  Haut de page  - 

Bon, je crois que tu ne saisis pas ma question et qu'un élément t'échappe pour lequel tu ne sembles pas vouloir ou pas oser poser de question. Note bien qu'il vaut mieux avoir l'air bête 5mn en posant une question que de ne pas la poser et rester bête toute sa vie.

Voici ce qu'il faut faire pour avoir rapidement et facilement des informations sur des tables dans une base de données en utilisant l'invite de commande.

D'abord, se connecter à l'invite de commande. Pour ce faire, voici un exemple sous Windows : s'il n'y a pas de raccourci pour le client MySQL en ligne de commande, ouvre une invite de commande Windows : Programmes > Accessoires > Invite de commande.
Dans cette fenêtre, taper alors :

    $> mysql -u root -p 

Il sera alors demandé le mot de passe de l'utilisateur root de MySQL. S'il n'a pas de mot de passe (c'est une très mauvaise idée), alors taper cette ligne sans le paramètre « -p »

Le résultat devrait ressembler à ceci :

    Microsoft Windows [version 6.1.7601]  
    Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.  
    Page de codes active : 65001  

    C:\Users\Cyrano>mysql -u root -p  
    Enter password: ********  
    Welcome to the MySQL monitor.  Commands end with ; or \g.  
    Your MySQL connection id is 77  
    Server version: 5.5.24-log MySQL Community Server (GPL)  

    Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.  

    Oracle is a registered trademark of Oracle Corporation and/or its  
    affiliates. Other names may be trademarks of their respective  
    owners.  

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  

    mysql>  

À partir de là, on peut effectuer beaucoup d'opérations, mais on va limiter à des commande pour récupérer des informations. VOici ce à quoi devrait ressembler le résultat, les explications suivront :

    mysql> USE test;  
    Database changed  
    mysql> SHOW TABLES;  
    +-----------------------+  
    | Tables_in_test        |  
    +-----------------------+  
    | cotisations           |  
    | famille_produit       |  
    | produit               |  
    | r_soc_has_param_sap   |  
    | sous_produit          |  
    | t_clients_cli         |  
    | t_conges_cgs          |  
    | t_essai               |  
    | t_essai_2             |  
    | t_majappclient_mac    |  
    | t_parametresappli_pra |  
    | t_societe_soc         |  
    +-----------------------+  
    12 rows in set (0.15 sec)  

    mysql> DESC t_essai;  
    +----------+-----------+------+-----+---------+-----------------------------+  
    | Field    | Type      | Null | Key | Default | Extra                       |  
    +----------+-----------+------+-----+---------+-----------------------------+  
    | Ch1      | int(11)   | NO   | PRI | NULL    | auto_increment              |  
    | horodate | timestamp | YES  |     | NULL    | on update CURRENT_TIMESTAMP |  
    | Ch2      | text      | YES  |     | NULL    |                             |  
    | Ch3      | text      | YES  |     | NULL    |                             |  
    | Ch4      | double    | YES  |     | NULL    |                             |  
    | Ch5      | double    | YES  |     | NULL    |                             |  
    | ch6      | double    | YES  |     | NULL    |                             |  
    | ch7      | double    | YES  |     | NULL    |                             |  
    +----------+-----------+------+-----+---------+-----------------------------+  
    8 rows in set (0.03 sec)  

    mysql> SHOW CREATE TABLE t_essai\G  
    *************************** 1. row ***************************  
           Table: t_essai  
    Create Table: CREATE TABLE `t_essai` (  
      `Ch1` int(11) NOT NULL AUTO_INCREMENT,  
      `horodate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,  
      `Ch2` text,  
      `Ch3` text,  
      `Ch4` double DEFAULT NULL,  
      `Ch5` double DEFAULT NULL,  
      `ch6` double DEFAULT NULL,  
      `ch7` double DEFAULT NULL,  
      PRIMARY KEY (`Ch1`)  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8  
    1 row in set (0.00 sec)  

    mysql>  

La première commande exécutée est « USE test » : ça veut dire en clair, « Je veux me connecter à la base test »

Ensuite, on affiche la liste des tables de cette base avec la commande « SHOW TABLES », le résultat s'affiche en tableau comme montré ci-dessus.

Ensuite, je veux la description d'une table en particulier, ici celle nommée « t_essai »

Enfin, je fais afficher la requête qui doit être exécutée pour créer cette table.

Refais quelque chose de similaire pour les deux tables utilisées dans ta requête, et là je disposerai de meilleurs éléments pour savoir pourquoi ta requête ne retourne pas le résultat attendu.

 
Par yaalo  -  Le 06/01/2016 19:27  -  Haut de page  - 

Si tu relis ce que tu as déjà lu tu verras que je n'ai pas accès à mon pc pour pouvoir t'envoyer la description des tables proprement donc cela n'a rien à voir avec comprendre ou ne pas comprendre ta question, tu t'emporte tout seul pour rien....

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !