8796 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

J'ai un petit problème sur une requete qui me parait complexe et qui, je l'espere ne vous rendra pas aussi perplexe que moi :

J'ai besoin, dans le cadre du site que je développe d'obtenir un affichage de type :

vente Paris
vente dijon
vente strasbourg
achat paris
achat dijon
achat strasbourg
....

Et ce pour toutes les entrées de mes tables "ville" et "type_transac" ... Jusqu'ici tout va bien... Seulement ensuite, je dois vérifier que les champs ville et type_transac contenus dans une table "biens" correspondent bel et bien à un bien, sans quoi, je n'afficherais pas la ligne concernée...

Je n'ai trouvé une solution qu'en imbriquant 2 boucles while, ce qui explique pourquoi la solution ne me convient pas... j'ai fait un truc comme ça :



$sql_ville = 'SELECT * FROM ville';
$req_ville = mysql_query($sql_ville)
while($donnees=mysql_fetch_array($req_ville))
{
	$nom_ville = $donnees['nom'];
	$id_ville = $donnees['id'];

	$sql_tb = 'SELECT * FROM type_transac';
	$req_tb = mysql_query($sql_tb)
	$affiche = "";
	while($donnees_tb=mysql_fetch_array($req_tb))
	{
		$nom_tb = $donnees_tb['nomtb'];
		$id_tb = $donnees_tb['idtb'];

		$sql_b = 'SELECT * FROM `biens` WHERE type_transac = "'.$id_tb.'" AND ville = "'.$id_ville.'"';
		$req_b = mysql_query($sql_b)
		$donnees_b = mysql_fetch_array($req_b);
		if(!$donnees_b)
		{
			echo $nom_tb.' '.$nom_ville."\n";
		}
	}
}



Evidemment, la page est plus que longe à afficher et souvent, elle ne s'affiche pas (délai dépassé)... J'ai beau reflechir, avec mes compétences, je ne vois pas de solutions pour passer outre ces imbrications, même avec une requete INNER JOIN... Une idée ?
Salut,

hmm... pas compris !

Ce serait plus simple en nous donnant la structure des tables et quelques exemples de ce qu'elle contiennent. Smiley murf


Edit: pour préciser ce que je ne comprends pas c'est que j'ai l'impression qu'il suffirait de faire :
SELECT tt.nomtb, v.nom FROM biens b, ville v, type_transac tt 
WHERE b.type_transac = tt.type_transac AND b.ville = v.ville
Mais je suppose que ce n'est pas si simple...
Modifié par Heyoan (03 Jun 2009 - 18:09)
.... Je fatigue là ....

Je capte ta logique qui me parait ... Logique ... ça m'étonne de pas y avoir pensé ... Donc possible qu'il y ait un problème... Je le teste dans la soirée, si ça marche, je met un poster de toi au dessus de mon lit et je m'auto-flagèlerai une petite vingtaine de fois... Si ça marche pas, j'expliquerais mon problème de façon plus poussée ^^

Dans tous les cas, merci pour ta réactivité Smiley biggrin
the_kaiin a écrit :
si ça marche, je met un poster de toi au dessus de mon lit
Les posters en question sont disponibles au format A4 et A3 pour la modique somme de 39,99 euro (44,99 en A3) Smiley lol

the_kaiin a écrit :
je m'auto-flagèlerai une petite vingtaine de fois...
Ne te donne pas cette peine : tous les modos seront ravis de te dépanner ! Smiley sm
ah oui ! voila ... Je sais pourquoi je pouvais pas faire ça Smiley langue

En fait, je créé ces colonnes et je dois faire des liens dessus, Or, pour faire des liens, j'ai besoin d'un deuxième champs "id" des tables ville et type_transac...

Je vais donc me lancer dans des explications ^^ Accrochez vous ! (Je vais simplifier un peu le tout sinon je vais m'y perdre :

J'ai une table `ville` contenant :

id_ville | nom_ville
1 | Paris
2 | Strasbourg
etc

J'ai un table type_transac contenant
id_tb | nom_tb
1 | achat
2 | vente
3 | Location
etc

Enfin, j'ai une table `biens` qui lie tout ça, contenant
id_bien | id_tb | id_ville
1 | 1 | 2 => Bien a la vente a Strasbourg...


A présent, je veux lister ces entrées ( pour un index de sitemap ) de la façon suivante :

vente Paris
vente dijon
vente strasbourg
achat paris
achat dijon
achat strasbourg
....

Et ce pour toutes mes villes, combinées avec tout mes type de transactions possibles mais uniquement pour ceux qui correspondent bien à un bien... Or, pour pouvoir créer mon lien vers le sitemap concerné, j'ai besoin du nom et de l'id du type de transaction et de la ville... Sans repetitions evidemment. Le pire c'est qu'en l'expliquant, ça me parait très simple mais une fois qu'il faut le faire, je m'embarque dans des requetes tordues...

Enfin bon, Heoyan, merci pour ta solution qui, hélas, ne fonctionne pas ... Le but est-il plus clair ?
ah oui ! voila ... Je sais pourquoi je pouvais pas faire ça Smiley langue

En fait, je créé ces colonnes et je dois faire des liens dessus, Or, pour faire des liens, j'ai besoin d'un deuxième champs "id" des tables ville et type_transac...

Je vais donc me lancer dans des explications ^^ Accrochez vous ! (Je vais simplifier un peu le tout sinon je vais m'y perdre :

J'ai une table `ville` contenant :

id_ville | nom_ville
1 | Paris
2 | Strasbourg
etc

J'ai un table type_transac contenant
id_tb | nom_tb
1 | achat
2 | vente
3 | Location
etc

Enfin, j'ai une table `biens` qui lie tout ça, contenant
id_bien | id_tb | id_ville
1 | 1 | 2 => Bien a la vente a Strasbourg...


A présent, je veux lister ces entrées ( pour un index de sitemap ) de la façon suivante :

vente Paris
vente dijon
vente strasbourg
achat paris
achat dijon
achat strasbourg
....

Et ce pour toutes mes villes, combinées avec tout mes type de transactions possibles mais uniquement pour ceux qui correspondent bien à un bien... Or, pour pouvoir créer mon lien vers le sitemap concerné, j'ai besoin du nom et de l'id du type de transaction et de la ville... Sans repetitions evidemment. Le pire c'est qu'en l'expliquant, ça me parait très simple mais une fois qu'il faut le faire, je m'embarque dans des requetes tordues...

Enfin bon, Heoyan, merci pour ta solution qui, hélas, ne fonctionne pas ... Le but est-il plus clair ?
Salut,

Je suis un peu comme Heyoan. La solution m'a l'air trop simple, donc ce n'est probablement pas ça. Perso, je règle ça avec deux bêtes jointures :
SELECT
    id_bien,
    nom_tb,
    nom_ville
FROM
    biens
    LEFT JOIN type_transac
        ON type_transac.id_tb = biens.id_tb
    LEFT JOIN ville
        ON ville.id_ville = biens.id_ville

1. Ça te donne la liste des biens avec pour chacun le type de transaction et la ville.
2. Tu peux classer la liste avec un order by.
3. Si tu as besoin de plus de champs (id de la ville, de la transaction, etc.) il te suffit de les rajouter après le "SELECT".

Il y a des points que tu pourrais probablement éclaircir dans ta description, par exemple :
a écrit :
En fait, je créé ces colonnes
Quelles colonnes ?
a écrit :
mais uniquement pour ceux qui correspondent bien à un bien
Parce que ta table biens contient des entrées qui ne correspondent pas à un bien ? Smiley sweatdrop
a écrit :
j'ai besoin du nom et de l'id du type de transaction et de la ville... Sans repetitions evidemment
Donc tu ne veux qu'une seul bien par ville ? (parce que sinon ta ville sera répétée)
Modifié par marcv (04 Jun 2009 - 10:48)
Bonjour marcv

Alors ... Je ne vais pas commenter ta solution car pas encore testée ^^ Je vais m'y atteler de ce pas, par contre, je peux répondre à tes questions :

a écrit :

En fait, je créé ces colonnes

Quelles colonnes ?


Les colonnes dont je me suis servies en exemple pour vous montrer le résultat attendu... Au final, je me fous que mes résultats sortent en colonne ou en ligne ou en quoi que ça soit tant que j'ai les informations dont j'ai besoin dans la bdd Smiley cligne

a écrit :

mais uniquement pour ceux qui correspondent bien à un bien

Parce que ta table biens contient des entrées qui ne correspondent pas à un bien ? sweatdrop

Non non, tous les champs de la table bien correspondent bel et bien a un bien ... Bien ou bien ? Smiley smile J'ai insisté sur ce fait car dans la méthode que j'avais employé initialement, je partais des villes combinées avec les type de transactions pour créer ma liste, Or, je n'aurais pas dans ma base de données de location à pétaouchnoque (pour l'exemple) à proposer... Je ne veux donc pas afficher la ligne "locations à Pétaouchnoque". Évidemment, en partant de la table biens comme vous le faite, le problème ne se pose plus...

a écrit :

j'ai besoin du nom et de l'id du type de transaction et de la ville... Sans repetitions evidemment

Donc tu ne veux qu'une seul bien par ville ? (parce que sinon ta ville sera répétée)

Oui, c'est tout à fait ça ! Ma bdd possède des nombreuses villes dans lesquelles je propose plusieurs biens... Or, sur cette page qui sera un index de sitemap, je ne souhaite afficher la ville qu'une seule fois, même si elle comprend une centaine de biens. Grâce aux infos récoltées, je pourrais justement créer le lien vers le sitemap de la ville qui, lui, indexera la totalité des biens présents sur cette ville...


Je suis désolé de ne pas être plus clair mais je fais mon maximum et à force d'être dedans, c'est dur de sortir la tête du guidon pour poser le problème de façon simple... j'espère que j'ai pu t'éclairer, merci pour ta réponse, je vais l'essayer ti suite.
Ok, ça devient un peu plus clair. Est-ce que c'est ça :
SELECT
    ville.nom_ville,
    ville.id_ville,
    type_transac.nom_tb,
    type_transac.id_tb
FROM
    biens
    LEFT JOIN type_transac
        ON type_transac.id_tb = biens.id_tb
    LEFT JOIN ville
        ON ville.id_ville = biens.id_ville
GROUP BY
    nom_ville,
    nom_tb
?
ça marche très bien excepté un petit souci ... La requête me sort toutes les combinaisons mais fonctionne avec des NULL aussi alors que la base n'en comporte pas ... Bref, j'ai ajouté une petite vérification légère des variables nom_ville et nom_tb et tout fonctionne parfaitement !

Tout à coup, la vie redevient belle, les oiseaux chantent et le ciel est bleu
Traduction : Merci beaucoup vous deux, vous m'ôtez une belle épine du pied ! Dans l'espoir de pouvoir un jour vous rendre la pareille (oui oui ça arrivera peut être un jour lointain Smiley biggrin ) Bonne journée !
Modifié par the_kaiin (04 Jun 2009 - 14:31)
the_kaiin a écrit :
ça marche très bien excepté un petit souci ... La requête me sort toutes les combinaisons mais fonctionne avec des NULL
Alors c'est que des liens n'existent pas entre les tables (ce qui semble étrange d'après ce que tu as dit). Quoi qu'il en soit il suffit de remplacer LEFT JOIN par INNER JOIN ou simplement JOIN.