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 :

Problème de requête!


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Problème de requête!
    Bonjour a tous, depuis quelques jours je bloque sur une requête sql, j'aimerais faire afficher des informations relatives a un projet, ainsi que le chef de projet correspondant. Malheureusement, la sous-requette qui me permet d'afficher le chef de projet me retourne plusieurs lignes alors que la requette pour afficher les autres information n'en retourne qu'une seule. Je ne sais donc pas comment faire pour afficher les chefs de projet correspondant au projet séléctionner.
    Voilà ma requette :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    SELECT e.pm_id, 
    	e.pm_number, 
    	e.pm_title, 
    	e.pm_description, 
    	e.pm_campagne, 
    	e.pm_completion, 
    	e.pm_number_macif, 
    	e.pm_horodatage,
    	from_unixtime(e.pm_modified, '%d/%m/%Y %H:%i') as date_modifcation, 
    	from_unixtime(e.pm_created, '%d/%m/%Y') as date_creation, 
    	from_unixtime(e.pm_planned_start, '%d/%m/%Y') as date_debut_prev, 
    	from_unixtime(e.pm_planned_end, '%d/%m/%Y') as date_fin_prev, 
    	from_unixtime(e.pm_real_start, '%d/%m/%Y') as date_debut_reel, 
    	from_unixtime(e.pm_real_end, '%d/%m/%Y') as date_fin_reel, 
    	(
    		select l2.pm_budget_lib 
    		from egw_pm_budget_lib l2, egw_pm_projects e2 
    		where e2.pm_status = l2.pm_budget_code 
    			and e.pm_id = e2.pm_id
    	) as 'STATUT', 
    	(
    		select l3.pm_budget_lib 
    		from egw_pm_budget_lib l3, egw_pm_projects e3 
    		where e3.pm_state = l3.pm_budget_code 
    			and e.pm_id = e3.pm_id
    	) as 'STATE', 
    	(
    		select l4.pm_budget_lib 
    		from egw_pm_budget_lib l4, egw_pm_projects e4 
    		where e4.pm_partenaire = l4.pm_budget_code 
    			and e.pm_id = e4.pm_id
    	) as 'PARTENAIRE', 
    	(
    		select l5.pm_budget_lib 
    		from egw_pm_budget_lib l5, egw_pm_projects e5 
    		where e5.pm_analytique = l5.pm_budget_code 
    			and e.pm_id = e5.pm_id
    	) as 'AXE1', 
    	(
    		select l6.pm_budget_lib 
    		from egw_pm_budget_lib l6, egw_pm_projects e6 
    		where e6.pm_type = l6.pm_budget_code 
    			and e.pm_id = e6.pm_id
    	) as 'TYPE' , 
    	(
    		select concat(a.n_family,' ',a.n_given) 
    		from egw_pm_roles r, egw_pm_members m, egw_addressbook a, egw_pm_projects e5 
    		where e5.pm_id = e.pm_id 
    			and e5.pm_id = m.pm_id 
    			and m.role_id = r.role_id 
    			and r.role_id = '5' 
    			and m.member_uid = a.account_id 
    		group by e5.pm_id
    	) as 'PILOTE' 
    FROM egw_pm_projects_histo e 
    WHERE e.pm_id= 1192;
    Cette requette m'affiche 3 lignes, avec toutes les informations que je veux, mais toujours le même chef de projet, alors qu'il devrait être différent a chaque fois.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    bon d'en bout comme ça perso je ne comprend rien, mise à part que vous avez un problème de modélisation.
    Ceci étant dit ca ne va pas impacter le résultat.

    Donc .... présentez votre MCD.

    Ensuite :
    Malheureusement, la sous-requette qui me permet d'afficher le chef de projet me retourne plusieurs lignes
    Comment fait-on pour reconnaitre un chef de projet ?
    Pourquoi y a-t-il plusieurs lignes retournées pour connaitre un chef de projet ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci d'avoir répondu aussi vite !

    Tout d'abord, le MCD de la base contient 132 tables qui n'ont aucune clés étrangères... Il n'y a donc aucuns liens visibles quand nous le générons ( Nous n'avons pas créé cette base, nous l'avons récupéré comme cela et c'était déjà trop tard >< )

    La sous-requête pour le chef de projet est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select concat(a.n_family,' ',a.n_given)
    from egw_pm_roles r, egw_pm_members m, egw_addressbook a, egw_pm_projects e5
    where e5.pm_id = e.pm_id
    	and e5.pm_id = m.pm_id
    	and m.role_id = r.role_id
    	and r.role_id = '5'
    	and m.member_uid = a.account_id
    group by e5.pm_id) as 'PILOTE'
    Le chef de projet est reconnu grâce a la restriction r.role_id = 5, ce numéro est réservé exclusivement a eux.

    Cette requête va servir a remplir un tableau nommer ' Historique du projet ' , qui comportera toutes les modifications apportées au projet par date.
    Les chefs de projet peuvent quant a eux changer en cours de projet, il y aura donc différents chef de projet, pour le même projet, mais a des dates différentes.
    Et quand nous exécutons notre requête dans le SGBD, l'erreur vient effectivement du nombres de ligne que contient la requête du chef de projet..
    Mais nous ne voyons pas comment faire autrement

    Désolé si je ne suis pas très clair :s

    Autre petite précision, les informations du tableau sont toutes dans la même table, la table projet. Alors que le chef de projet a sa table a lui ( egw_pm_member )

    Merci d'avance

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par Kami-Desu Voir le message
    Cette requête va servir a remplir un tableau nommer ' Historique du projet ' , qui comportera toutes les modifications apportées au projet par date.
    Les chefs de projet peuvent quant a eux changer en cours de projet, il y aura donc différents chef de projet, pour le même projet, mais a des dates différentes.
    Lequel (lesquel) voullez-vous garder et sur quel critère ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Voilà ce que nous voulons :

    Nom : screen.PNG
Affichages : 43
Taille : 323,0 Ko

    Et voici le code :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <table>
    		<tr>
    			<th class="detail_Titre_GENERAL"> Date de modification </th>
    			<th class="detail_Titre_GENERAL"> Etat </th>
    			<th class="detail_Titre_GENERAL"> Avancement </th>
    			<th class="detail_Titre_GENERAL"> Campagne recette utilisateur </th>
    			<th class="detail_Titre_GENERAL"> Date début prévisionnelle </th>
    			<th class="detail_Titre_GENERAL"> Date fin prévisionnelle </th>
    			<th class="detail_Titre_GENERAL"> Date début réel </th>
    			<th class="detail_Titre_GENERAL"> Chef de projet </th>	
    		</tr>
    		<?php do { ?>
    		<tr class="detail_GENERAL_petit">
    			  <td ><?php echo $row_Titre_histo['pm_horodatage'];  ?></td>
    			  <td ><?php echo $row_Titre_histo['STATE'];          ?></td>
    			  <td ><?php echo $row_Titre_histo['pm_completion'];  ?></td>
    			  <td ><?php echo $row_Titre_histo['pm_campagne'];    ?></td>
    			  <td ><?php echo $row_Titre_histo['date_debut_prev'];?></td>
    			  <td ><?php echo $row_Titre_histo['date_fin_prev'];  ?></td>
    			  <td ><?php echo $row_Titre_histo['date_debut_reel'];?></td>
    			  <td ><?php echo $row_Titre_histo['PILOTE'];?></td>
    		</tr>
    		  <?php  }while ($row_Titre_histo = mysql_fetch_assoc($Titre_histo)) ;  ?>	
     
    	</table>
    Les informations sont donc bien misent dans le tableau comme nous pouvons voir sur la pièce jointe, mais le chef de projet est toujours le même ! ( le premier de la liste des différents chef de projet rattachés a ce projet )
    Nous avons épuiser toutes nos connaissances et le seul moyen que nous avons trouver est de séparer les requêtes, et de coller les tableaux cotes a cotes... Mais nous préférerions avoir une seule vraie requête

  6. #6
    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
    C'est une horreur cette requête !

    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) Toutes ces sous-requêtes doivent pouvoir être remplacées par des jointures. Ne figureraient alors dans le SELECT que plusieurs instances de pm_budget_lib.

    J'ai commencé à faire ça mais je n'en suis pas sûr et j'ai autre chose à faire mais voilà l'idée :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    SELECT e.pm_id, 
    	e.pm_number, 
    	e.pm_title, 
    	e.pm_description, 
    	e.pm_campagne, 
    	e.pm_completion, 
    	e.pm_number_macif, 
    	e.pm_horodatage,
    	FROM_UNIXTIME(e.pm_modified, '%d/%m/%Y %H:%i') as date_modifcation, 
    	FROM_UNIXTIME(e.pm_created, '%d/%m/%Y') as date_creation, 
    	FROM_UNIXTIME(e.pm_planned_start, '%d/%m/%Y') as date_debut_prev, 
    	FROM_UNIXTIME(e.pm_planned_end, '%d/%m/%Y') as date_fin_prev, 
    	FROM_UNIXTIME(e.pm_real_start, '%d/%m/%Y') as date_debut_reel, 
    	FROM_UNIXTIME(e.pm_real_end, '%d/%m/%Y') as date_fin_reel, 
    	l2.pm_budget_lib AS STATUT,
    	l3.pm_budget_lib AS STATE,
    	l4.pm_budget_lib AS PARTENAIRE,
    	l5.pm_budget_lib AS AXE1,
    	l6.pm_budget_lib AS TYPE
    FROM egw_pm_projects_histo e 
    INNER JOIN egw_pm_projects e2 ON e.pm_id = e2.pm_id
    	INNER JOIN egw_pm_budget_lib l2 ON e2.pm_status = l2.pm_budget_code
    	INNER JOIN egw_pm_budget_lib l3 ON e2.pm_state = l3.pm_budget_code
    	INNER JOIN egw_pm_budget_lib l4 ON e2.pm_partenaire = l4.pm_budget_code
    	INNER JOIN egw_pm_budget_lib l5 ON e2.pm_analytique = l5.pm_budget_code
    	INNER JOIN egw_pm_budget_lib l6 ON e2.pm_type = l6.pm_budget_code
    	INNER JOIN -- la sous-requête sur le chef de projet.
    WHERE e.pm_id = 1192
    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 !

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci d'avoir répondu cinePhil
    Désolé pour nos requêtes mais nous sommes encore en première années de BTS informatique et nous avons appris a faire les jointures entre les clés primaires et les clés étrangères, pas avec des inner join ! Mais nous allons regarder attentivement comment cela fonctionne pour tenter de résoudre notre problème

  8. #8
    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
    Et bien votre prof a besoin de se recycler !
    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 !

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Je ne peux malheureusement pas lui en faire part ^^
    Mais je lui en parlerais a la prochaine occasion pour avoir son avis sur les inner join !

    Malgré tout, notre problème reste le même, la sous requête renvoi 3 chefs de projet différent, alors qu'elle ne peux contenir qu'une seule valeur....

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    cf mon message plus haut, il faut que vous decriviez sur quel critère de sélection se fera l'heureux élu..

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Le problème c'est qu'il n'y a pas d'heureux élu, nous voulons tous les voir s'afficher :s ( tous les chefs qui ont subit des modifications dans se projets )

    Désolé si je ne comprend pas ce que tu veux me dire :/

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Pardon, j'ai mal lu votre réponse.

    Dans votre requête pour retrouver les chef de projet vous avez positionné un group by.

    (de plus c'est mal fait vu que vous n'utilisez pas de fonction d'agrégation)


    De ce fait le système ne vous retrouve qu'une seul ligne par dimension.

    Donc c'est normal que pour un même projet il ne vous retourne qu'un seul chef de projet.

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Nous avons essayer sans le GROUP BY et la requête nous retourne toujours le même résultat, qui est :

    Subquery returns mores than 1 row


  14. #14
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Vous devez faire une jointure entre cette sous-requête et votre requête principale.

    Et ne pas l'utilisez directement dans le "SELECT".

    Cf le re-work de Cinephil.

Discussions similaires

  1. Réponses: 19
    Dernier message: 27/08/2003, 15h32
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème de requètes concurentes
    Par Emmanuel.G dans le forum XMLRAD
    Réponses: 3
    Dernier message: 08/08/2003, 16h51
  4. Réponses: 2
    Dernier message: 16/07/2003, 14h40
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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