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 requête


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 87
    Points
    87
    Par défaut Problème requête
    Bonjour,
    mon problème est le suivant:
    j'ai une requête qui doit me renvoyer les voyages en fonctions d'informations envoyé (via la commande like '%%').
    Quand je reçois mes informations, elles sont affichées mais en plusieurs fois. A savoir dans un voyage, j'ai des étapes et si il y a le même mot dans 3 étapes, il me sortiras trois fois le voyage.
    Comment faire pour qu'il puisse m'extraire simplement une fois le voyage voulut même si il y a plusieurs étapes dans ce voyage qui corresponde à ma recherche?

    Voici mon 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    $multi_array = array() ;
    $sql = "SELECT groupes_voyages.id_voyage_serveur, voyage.id_voyage_serveur,";
    $sql = $sql." voyage.nom_voyage,voyage.detail_voyage, 0 as nbre_jaime, ";
    $sql = $sql." etapes.adresse , etapes.hebergement , etapes.particularite_etape, ";
    $sql = $sql." etapes.a_voir, etapes.a_faire , etapes.remarque, voyage.id_parametres, parametres.pseudo ";
    $sql = $sql." FROM groupes_voyages, voyage, etapes, parametres";
    $sql = $sql." WHERE groupes_voyages.id_voyage_serveur = voyage.id_voyage_serveur ";
    $sql = $sql." AND groupes_voyages.id_voyage_serveur = etapes.id_voyage_serveur ";
    $sql = $sql." AND groupes_voyages.id_groupes = 36 ";
    $sql = $sql." AND voyage.id_parametres = parametres.id_parametres";
    $sql = $sql." AND ( voyage.nom_voyage LIKE '%$voyage_search%' ";
    $sql = $sql." OR voyage.detail_voyage LIKE '%$voyage_search%' ";
    $sql = $sql." OR etapes.adresse LIKE '%$voyage_search%' ";
    $sql = $sql." OR etapes.hebergement LIKE '%$voyage_search%' ";
    $sql = $sql." OR etapes.particularite_etape LIKE '%$voyage_search%' ";
    $sql = $sql." OR etapes.a_voir LIKE '%$voyage_search%' ";
    $sql = $sql." OR etapes.a_faire LIKE '%$voyage_search%' ";
    $sql = $sql." OR etapes.remarque LIKE '%$voyage_search%' ";
    $sql = $sql." OR parametres.pseudo LIKE '%$voyage_search%')";
    //$sql = $sql." AND voyage.id_liste_type_voyage = 2";
    $sql = $sql." ORDER BY groupes_voyages.id_voyage_serveur DESC " ;
    $requete = mysql_query($sql) ;
    if (!$requete) {
    	$message  = 'Requête invalide : ' . mysql_error() . "\n";
    	$message .= 'Requête complète : ' . $sql;
    	}
    	$i = 0 ;
    	while ($row = mysql_fetch_assoc($requete)) {
    		$multi_array[$i] = $row ;
    		//	echo $multi_array[$i]['id_voyage_serveur'].PHP_EOL;
    		 $sql2 = "SELECT id_voyage_serveur, COUNT(*) AS nbre_jaime";
            	 $sql2 = $sql2." FROM jaime";
    		 $sql2 = $sql2." WHERE id_voyage_serveur=".$multi_array[$i]['id_voyage_serveur'];
                     $sql2 = $sql2." GROUP BY id_voyage_serveur ";
    		 //  echo $sql2.PHP_EOL;
    		 $requete2 = mysql_query($sql2) ;
    		 if (!$requete2) {
                        echo 'Impossible d\'exécuter la requête : ' . mysql_error();
                  	    //exit;
    		 }
    		 $row1 = mysql_fetch_row($requete2);
    		 if ($row1 == "")
    		 	$multi_array[$i]['nbre_jaime']=0;
    		 else
    		 	$multi_array[$i]['nbre_jaime']=$row1[1];
    		    //
    	$i++ ;
    	}
    return $multi_array ;
    Merci pour votre aide.

    Loïc

  2. #2
    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
    1) Vous vous compliquez bien la vie pour écrire votre requête dans le code PHP !

    2) L'utilisation d'alias pour les tables est fortement recommandé dès qu'il y a plus d'une table dans la requête. Cela facilite l'écriture et la lecture de celle-ci. Il faut ensuite utiliser systématiquement ces alias devant chaque colonne nommée pour savoir facilement de quelle table elle vient.

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

    4) Vous récupérez deux fois la même information dans votre requête et sans renommer la colonne, ce qui peut entraîner une ambiguïté dans le traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT groupes_voyages.id_voyage_serveur, voyage.id_voyage_serveur
    Voici votre code remis en forme :
    Code PHP : 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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    $multi_array = array() ;
     
    $sql = "
    	SELECT 
    		v.id_voyage_serveur,
    		v.nom_voyage,
    		v.detail_voyage,
    		0 as nbre_jaime,
    		e.adresse ,
    		e.hebergement ,
    		e.particularite_etape,
    		e.a_voir,
    		e.a_faire ,
    		e.remarque,
    		v.id_parametres,
    		p.pseudo
    	FROM groupes_voyages gv
    	INNER JOIN voyage v ON gv.id_voyage_serveur = v.id_voyage_serveur
    		INNER JOIN parametres p ON v.id_parametres = p.id_parametres
    	INNER JOIN etapes e ON gv.id_voyage_serveur = e.id_voyage_serveur
    	WHERE gv.id_groupes = 36
    		AND
    		(
    			v.nom_voyage LIKE '%$voyage_search%'
    			OR v.detail_voyage LIKE '%$voyage_search%'
    			OR e.adresse LIKE '%$voyage_search%'
    			OR e.hebergement LIKE '%$voyage_search%'
    			OR e.particularite_etape LIKE '%$voyage_search%'
    			OR e.a_voir LIKE '%$voyage_search%'
    			OR e.a_faire LIKE '%$voyage_search%'
    			OR e.remarque LIKE '%$voyage_search%'
    			OR p.pseudo LIKE '%$voyage_search%'
    		)
    ";
     
    //$sql = $sql." AND voyage.id_liste_type_voyage = 2";
     
    $sql = $sql." ORDER BY gv.id_voyage_serveur DESC " ;
     
    $requete = mysql_query($sql) ;
    IF (!$requete)
    {
    	$message  = 'Requête invalide : ' . mysql_error() . "\n";
    	$message .= 'Requête complète : ' . $sql;
    }
     
    $i = 0 ;
    while ($row = mysql_fetch_assoc($requete))
    {
    	$multi_array[$i] = $row ;
    	//	echo $multi_array[$i]['id_voyage_serveur'].PHP_EOL;
     
    	$sql2 = "
    		SELECT id_voyage_serveur, COUNT(*) AS nbre_jaime
    		FROM jaime
    		WHERE id_voyage_serveur = ".$multi_array[$i]['id_voyage_serveur'].
    		GROUP BY id_voyage_serveur
    	";
     
    	//  echo $sql2.PHP_EOL;
     
    	$requete2 = mysql_query($sql2) ;
    	IF (!$requete2)
    	{
    		echo 'Impossible d\'exécuter la requête : ' . mysql_error();
    		//exit;
    	}
     
    	$row1 = mysql_fetch_row($requete2);
    	IF ($row1 == "")
    		$multi_array[$i]['nbre_jaime']=0;
    	else
    		$multi_array[$i]['nbre_jaime']=$row1[1];
    	//
     
    	$i++ ;
    }
    RETURN $multi_array ;

    Concernant votre problème, comme votre recherche ne portera pas forcément sur une étape mais peut donner un résultat seulement sur le nom du voyage, on ne peut pas se contenter de faire une recherche que sur les étapes puis récupérer les informations des voyages correspondant, de manière unique.

    Dans le cas présent, le mieux est probablement de gérer en PHP le changement de voyage dans le parcours du tableau de résultat.

    Par ailleurs, je propose aussi une simplification en comptant les "j'aime " dans la première requête :
    Code PHP : 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
    $sql = "
    	SELECT gv.id_voyage_serveur,
    		v.id_voyage_serveur,
    		v.nom_voyage,
    		v.detail_voyage,
    		0 as nbre_jaime,
    		e.adresse ,
    		e.hebergement ,
    		e.particularite_etape,
    		e.a_voir,
    		e.a_faire ,
    		e.remarque,
    		v.id_parametres,
    		p.pseudo,
    		COUNT(DISTINCT id_jaime) AS nbre_jaime -- choix de la colonne à compter à voir selon la structure de la table
    	FROM groupes_voyages gv
    	INNER JOIN voyage v ON gv.id_voyage_serveur = v.id_voyage_serveur
    		INNER JOIN parametres p ON v.id_parametres = p.id_parametres
    		INNER JOIN jaime j ON j.id_voyage_serveur = v.id_voyage_serveur
    	INNER JOIN etapes e ON gv.id_voyage_serveur = e.id_voyage_serveur
    	WHERE gv.id_groupes = 36
    		AND
    		(
    			v.nom_voyage LIKE '%$voyage_search%'
    			OR v.detail_voyage LIKE '%$voyage_search%'
    			OR e.adresse LIKE '%$voyage_search%'
    			OR e.hebergement LIKE '%$voyage_search%'
    			OR e.particularite_etape LIKE '%$voyage_search%'
    			OR e.a_voir LIKE '%$voyage_search%'
    			OR e.a_faire LIKE '%$voyage_search%'
    			OR e.remarque LIKE '%$voyage_search%'
    			OR p.pseudo LIKE '%$voyage_search%'
    		)
    ";
     
    //$sql = $sql." AND voyage.id_liste_type_voyage = 2";
     
    $sql = $sql."
    	GROUP BY gv.id_voyage_serveur,
    		v.id_voyage_serveur,
    		v.nom_voyage,
    		v.detail_voyage,
    		0 as nbre_jaime,
    		e.adresse ,
    		e.hebergement ,
    		e.particularite_etape,
    		e.a_voir,
    		e.a_faire ,
    		e.remarque,
    		v.id_parametres,
    		p.pseudo
    	ORDER BY gv.id_voyage_serveur DESC " ;
    Ainsi, pas besoin de boucler sur chaque ligne pour lancer X requêtes de comptage, ce qui est bien plus lourd !
    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 !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 87
    Points
    87
    Par défaut
    Merci super par contre, sur le dernier voyage si j'ai deux étapes dans lequel j'ai l'info il m'en affichera deux et non une.

    Comment faire pour qu'il ne m'affiche simplement une fois le voyage et non deux ....

    Merci d'avance

    Loïc

  4. #4
    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 normal puisque l'étape figure dans le regroupement.
    Il faut gérer ça en PHP dans le parcours du tableau ou bien ne pas demander l'étape.

    Ça dépend du besoin.

    S'il s'agit d'obtenir d'abord la liste des voyages correspondant au critère de recherche pour que l'utilisateur choisisse ensuite de visualiser le détail du voyage qui l'intéresse, même si le critère figure dans une ou plusieurs étapes, il suffit de simplifier la requête en supprimant du SELECT et du GROUP BY les colonnes relatives à l'étape :
    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
    $sql = "
    	SELECT gv.id_voyage_serveur,
    		v.id_voyage_serveur,
    		v.nom_voyage,
    		v.detail_voyage,
    		0 as nbre_jaime,
    		v.id_parametres,
    		p.pseudo,
    		COUNT(DISTINCT id_jaime) AS nbre_jaime -- choix de la colonne à compter à voir selon la structure de la table
    	FROM groupes_voyages gv
    	INNER JOIN voyage v ON gv.id_voyage_serveur = v.id_voyage_serveur
    		INNER JOIN parametres p ON v.id_parametres = p.id_parametres
    		INNER JOIN jaime j ON j.id_voyage_serveur = v.id_voyage_serveur
    	INNER JOIN etapes e ON gv.id_voyage_serveur = e.id_voyage_serveur
    	WHERE gv.id_groupes = 36
    		AND
    		(
    			v.nom_voyage LIKE '%$voyage_search%'
    			OR v.detail_voyage LIKE '%$voyage_search%'
    			OR e.adresse LIKE '%$voyage_search%'
    			OR e.hebergement LIKE '%$voyage_search%'
    			OR e.particularite_etape LIKE '%$voyage_search%'
    			OR e.a_voir LIKE '%$voyage_search%'
    			OR e.a_faire LIKE '%$voyage_search%'
    			OR e.remarque LIKE '%$voyage_search%'
    			OR p.pseudo LIKE '%$voyage_search%'
    		)
    ";
     
    //$sql = $sql." AND voyage.id_liste_type_voyage = 2";
     
    $sql = $sql."
    	GROUP BY gv.id_voyage_serveur,
    		v.id_voyage_serveur,
    		v.nom_voyage,
    		v.detail_voyage,
    		0 as nbre_jaime,
    		v.id_parametres,
    		p.pseudo
    	ORDER BY gv.id_voyage_serveur DESC
    ";
    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 !

Discussions similaires

  1. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  2. erreur3073 Problème requête
    Par amel123456789 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2004, 10h15
  3. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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