8796 sujets

Développement web côté serveur, CMS

Bonjour à tous, j'ai besoin de votre aide. Je ne suis pas très douée en prog web donc soyez indulgents svp...

Voilà, j'ai une partie recherche sur mon site, qui se compte d'un input text et de 7 listes déroulantes. Quand je fais une recherche sur une ville en particulier, aucun soucis, il me met une fois chaque résultat. Mais quand je fais une recherche sur la France, sans spécifier de région, de département ou de ville, il me met 56 fois la même annonce. Je vous donne le lien : http://www.immova.fr/accueil.php

Voici ma requête :

$requeteanngrand = "SELECT DISTINCT *
				FROM annonce JOIN type_annonce JOIN batiment JOIN appartient JOIN utilisateur
				LEFT JOIN pays on (pays_no_pays = ann_no_pays)
				LEFT JOIN region on (reg_no_pays = pays_no_pays)
				LEFT JOIN departement on (dep_no_region = reg_no_region)
				LEFT JOIN ville on (vil_no_dept = dep_no_dept AND ann_no_ville = vil_no_ville)
				WHERE app_no_type = typ_no_type
				AND util_no_utilisateur = ann_no_utilisateur
				AND app_no_batiment = bat_no_batiment
				AND ann_no_appartient = app_no_appartient
				AND ann_no_annonce = $id_annonce 
				GROUP BY ann_no_annonce";



J'ai fait un group by sur le numéro de l'annonce, histoire qu'il me l'affiche une fois. De plus, j'ai rajouté un select DISTINCT.

Je ne vois pas quoi faire d'autre,

Merci d'avance pour votre aide.
Salut,

Il vaut mieux que tu indiques les champs que tu veux recuperer dans ta requete.
Au lieu de
SELECT DISTINCT *

Tu aurais quelque chose dans le genre
SELECT DISTINCT annonce.id, annonce.name ...


Comme ca tu sauras precisement les valeurs sur lesquels tu feras le DISTINCT.
Avec tes jointures, c'est plus compliques de voir sur quoi s'applique le DISTINCT en faisant un SLECT *
J'ai modifié comme ça, je sais pas si c'est juste :



$requeteanngrand = "SELECT DISTINCT (ann_no_annonce), ann_titre, ann_prix, pays_nom_pays, reg_nom_region, 	dep_nom_dept, vil_nom_ville, typ_nom_type, ann_nb_pieces, ann_surface, ann_description, util_nom, util_prenom, util_no_tel, ann_photo_1, ann_photo_2, ann_photo_3, ann_no_pays, pays_no_pays, reg_no_pays, dep_no_region, reg_no_region, vil_no_dept, dep_no_dept, ann_no_ville, vil_no_ville, ann_no_utilisateur, util_no_utilisateur, app_no_type, typ_no_type, app_no_appartient, ann_no_appartient, app_no_batiment, bat_no_batiment
				FROM annonce JOIN type_annonce JOIN batiment JOIN appartient JOIN utilisateur
				LEFT JOIN pays on (pays_no_pays = ann_no_pays)
				LEFT JOIN region on (reg_no_pays = pays_no_pays)
				LEFT JOIN departement on (dep_no_region = reg_no_region)
				LEFT JOIN ville on (vil_no_dept = dep_no_dept AND ann_no_ville = vil_no_ville)
				WHERE app_no_type = typ_no_type
				AND util_no_utilisateur = ann_no_utilisateur
				AND app_no_batiment = bat_no_batiment
				AND ann_no_appartient = app_no_appartient
				AND ann_no_annonce = $id_annonce 
				GROUP BY ann_no_annonce";

Hello Ines,

hem... le SQL ne s'improvise pas. Smiley cligne

Plus précisément :
* le GROUP BY est à priori inutile (contrairement au DISTINCT)
* chaque partie de la requête (et notamment chaque jointure) ne devrait être ajoutée que si un champ a été renseigné (génération dynamique).
* tu ne dois sélectionner que les champs qui te seront utiles dans l'affichage des résultats et pas forcément ceux qui servent aux jointures.
* etc.

Je t'invite à lire les tutos proposés par sqlpro.
Modifié par Heyoan (09 Jun 2009 - 13:49)