8711 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai une page dans laquelle je dois faire affiché une série de produits et leurs photo.
Les 2 sont dans des tables différentes. Donc j'ai une table contenant les numéro de produits et les nom. Et une seconde table contenant liens, nom de photo assigné à un numéro de produits.

Donc dans ma page, pour ma requête SQL, j'utilise une jointure. J'arrive à faire afficher les noms des produits, mais pas les photos...

Auparavant je faisait 2 requêtes une dans l'autre pour faire l'association. Mais on arrête pas de me dire que c'est pas bon faire ça... Ok fine... mais je fais comment ça partir de là?

code:
<?php
			$req = mysql_query( 
					"SELECT 
						P.`produits`, 
						P.`nom`,
						I.`lien`,
						I.`photo`
					FROM `produits` P
					LEFT JOIN `photos_produits` I
						ON I.`id_produits` = P.`produits`
					LEFT JOIN `categories` C
						ON P.`id_categories` = C.`fr`
					WHERE P.`etat` = 'actif' 
						AND P.`type` != 'inclus' 
						AND P.`kit` != 'hunt'
						AND P.`produits` NOT IN ('XCEL HD','XHD-SPORTACC')
					ORDER BY C.`fr`") or die("57 - ".mysql_error());
			while ($info = mysql_fetch_assoc($req)){
				?>
				<div>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="100" alt="" />
					<p><?php echo $info['nom'].'<br>(#'.$info['produits'].')'?></p>
				</div>
				<?php
			}
			?>

Modifié par juliesunset (16 May 2013 - 16:36)
Modérateur
Dans un cas où les photos ont plusieurs produits et les produits ont plusieurs photos.

3 tables....

1. produits
2. produits_photos
3. photos

http://img441.imageshack.us/img441/5928/produitsphotos.png

Pour le coup, on évite encore les requêtes bien lourdes avec le LEFT_JOIN hasardeux....

SELECT
	*
FROM
	photos AS p,
	photos_produits AS pp,
	produits as pr
WHERE
	p.id = pp.photos_id
AND
	pr.id = pp.produits_id

code fait de tête. Je peux m'être trompé

Dans le cas où les produits ont plusieurs photos et les photos ont un produit :
2 tables
1. produits
2. photos

http://img46.imageshack.us/img46/5441/produitsphotos2.png
on va encore éviter les trucs hasardeux, n'est ce pas ?

SELECT
	*
FROM
	photos AS p,
	produits AS pr
WHERE
	p.produits_id = pr.id

code fait de tête. Je peux m'être trompé
Modifié par niuxe (15 May 2013 - 22:36)
Non 3 tables
-categories (pour catégorisé les produits)
-produits (liste complète des produits)
-photos_produits (photos des produits)

Après dans ma requête j'appel les 3, mais c'est surtout produits et photos_principales qui vont être affiché.
Aaaarf!
Je vient de voir mon erreur!

ma requête serait plutôt:
$req = mysql_query( 
		"SELECT 
			P.`produits`, 
			P.`nom`,
			I.`lien`,
			I.`photo`
		FROM `produits` P
		LEFT JOIN `photos_produits` I
			ON I.`id_produits` = P.`id`
		LEFT JOIN `categories` C
			ON P.`id_categories` = C.`id`
		WHERE P.`etat` = 'actif' 
			AND P.`type` != 'inclus' 
			AND P.`kit` != 'hunt'
			AND P.`produits` NOT IN ('XCEL HD','XHD-SPORTACC')
		ORDER BY C.`fr`") or die("58 - ".mysql_error());


Mais pourquoi pas de LEFT JOIN?
Modifié par juliesunset (15 May 2013 - 22:25)
juliesunset a écrit :
J'ai une page dans laquelle je dois faire affiché une série de produits et leurs photo.
Je suis sur que dans ce cas, faire 2 requêtes sera la solution la plus simple.
Modérateur
benj a écrit :
Je suis sur que dans ce cas, faire 2 requêtes sera la solution la plus simple.


non non. Une bonne jointure bien placée suffit amplement.

ps : j'ai édité mes messages plus haut
Modifié par niuxe (15 May 2013 - 22:36)
Modérateur
juliesunset a écrit :
Non 3 tables
-categories (pour catégorisé les produits)
-produits (liste complète des produits)
-photos_produits (photos des produits)

Après dans ma requête j'appel les 3, mais c'est surtout produits et photos_principales qui vont être affiché.


Attention, je ne parle pas de categorie dans mes messages plus haut. Il faut étendre la requête dans ce cas là.

Les produits ont plusieurs categories et les categories ont plusieurs produits OU les categories ont plusieurs produits et les produits ont une seul categorie ?

au passage, le nom de la table photos_produits n'est peut être pas le noms adéquate. Voir un de mes message plus haut.
Modifié par niuxe (15 May 2013 - 22:43)
niuxe a écrit :
le left_join/right_join sert essentiellement à ce que tu ne veux pas dans la relation Smiley cligne La récupération sera faite dans la talbe de gauche (left_join dans ce cas) Donc perte de perfs automatiquement

http://www.w3schools.com/sql/sql_join_left.asp

Ok, par curiosité j'ai essayé avec un syntaxe comme tu avait indiqué plus haut et en fais ce que ça me donne, c'est que uniquement les produits ayant des photos assigné s'affichait. Bon en soit c'est correct, mais pour l'instant j'aimerais que tout s'affiche vue que je suis en pleinne prod. Je verrai plus tard pour optimiser la requête.

a écrit :
Je suis sur que dans ce cas, faire 2 requêtes sera la solution la plus simple.

En fait là avec ma nouvelle structure de BDD je doit utiliser les jointures, pas le choix. Et donc, tant qu'à y être une seule requête. Mais comme tu as pu voir avec ma correction, ça fonctionne très bien.
Modifié par juliesunset (15 May 2013 - 22:47)
niuxe a écrit :
Les produits ont plusieurs categories et les categories ont plusieurs produits OU les categories ont plusieurs produits et les produits ont une seul categorie ?

les categories ont plusieurs produits et les produits ont une seul categorie

Dans la table produits j'ai une colonne id_categorie qui assigne une catégorie au produit


niuxe a écrit :
au passage, le nom de la table photos_produits n'est peut être pas le noms adéquate. Voir un de mes message plus haut.
C'est le mieux que j'ai trouvé pour l'instant... je regarde ça.
Modérateur
juliesunset a écrit :

c'est que uniquement les produits ayant des photos assigné s'affichait.


Peux tu être un peu plus explicite stp. Je ne comprends pas bien : "des photos assignées" ? si tu as des photos pour les produits et puor autres choses, faut voir mon premier exemple. Dans ce cas, il faut une table de jointure universelle. Là pour le coup, faut voir à la modélisation de la base.

Dans les requêtes que j'ai écrites, j'ai mis "*". Il est évident qu'il est préférable de nommer les champs que l'on souhaite pour être plus performant.
Modifié par niuxe (15 May 2013 - 22:49)
niuxe a écrit :
Peux tu être un peu plus explicite stp. Je ne comprends pas bien : &quot;des photos assignées&quot; ?

Euh, j'essaie de reformuler... Pour le moment, toutes mes photos de produits ne sont pas entré dans la bdd. Quand j'entre une nouvelle photo dans la table photos_produits j'indique de quel produits il s'agit dans la colonne id_produits, qui correspond au id de la table produits.
Du coup quand je faisait la requête sans le LEFT JOIN, uniquement les produits qui on des photos s'affiche.

niuxe a écrit :
si tu as des photos pour les produits et puor autres choses, faut voir mon premier exemple. Dans ce cas, il faut une table de jointure universelle. Là pour le coup, faut voir à la modélisation de la base.

c'est pour ça que ma table contenant les photos s'appelle "photos_produits", je ne sais pas encore s'il y aura des photos autre que celles des produits.

niuxe a écrit :
Dans les requêtes que j'ai écrites, j'ai mis &quot;*&quot;. Il est évident qu'il est préférable de nommer les champs que l'on souhaite pour être plus performant.
Oui je sais, comme tu as pu voir.
Modérateur
juliesunset a écrit :

Euh, j'essaie de reformuler... Pour le moment, toutes mes photos de produits ne sont pas entré dans la bdd. Quand j'entre une nouvelle photo dans la table photos_produits j'indique de quel produits il s'agit dans la colonne id_produits, qui correspond au id de la table produits.
Du coup quand je faisait la requête sans le LEFT JOIN, uniquement les produits qui on des photos s'affiche.


A ce que j'ai compris, tu perds automatiquement des perf et ta requête est nettement plus hasardeuse. Après j'ai compris que tu es en train de mettre en oeuvre une new version de ton site. C'est compréhensible que pour l'instant c'est fastidieux (1000 .... produits / 10000.... photos reliées aux produits)
juliesunset a écrit :

c'est pour ça que ma table contenant les photos s'appelle &quot;photos_produits&quot;, je ne sais pas encore s'il y aura des photos autre que celles des produits.

Perso, je nome les tables le plus simplement possible et SUIVANT la relation entre les données de la table en elle même. Si je nomme une table comme tu le fais, c'est dans le cas d'une relation de n * n (plusieurs à plusieurs) entre deux tables et cette dernière est une table de jointure bien sûr. Après pour chipoter, je vais par ordre alphabétique "axxx_bxxx" (Ce qui me sert dans mon dev. php)


juliesunset a écrit :
Oui je sais, comme tu as pu voir.

+1
Modifié par niuxe (15 May 2013 - 23:18)
juliesunset a écrit :
En fait là avec ma nouvelle structure de BDD je doit utiliser les jointures, pas le choix. Et donc, tant qu'à y être une seule requête. Mais comme tu as pu voir avec ma correction, ça fonctionne très bien.
J'ai donc du mal comprendre ton besoin.
Tu n'as pas le besoin de regrouper tes photos par produit ?
Benj: Comme expliqué plus haut, j'ai 2 tables. Produits et photos_produits. La première contient la liste complète des produits, la 2e les photos des dit produits. Donc chaque photo est relié à un produit par une colonne "id_produits" qui correspond à "id" de la table produits.

J'avais simplement fait une erreur au niveau de ma jointure dans la requête. Mai là c'est beau, c'est corrigé et tout fonctionne très bien.

niuxe a écrit :
A ce que j'ai compris, tu perds automatiquement des perf et ta requête est nettement plus hasardeuse. Après j'ai compris que tu es en train de mettre en oeuvre une new version de ton site. C'est compréhensible que pour l'instant c'est fastidieux (1000 .... produits / 10000.... photos reliées aux produits)
En fais ce n'est pas un nouvelle version, mais bien un autre site qui n'a rien à voir avec celui dont je parle habituellement (-spypoint.com-). Et donc je recommence à zéro, c'est donc l'occasion pour moi de faire les choses plus proprement. Je vais donc revoir ma requête que je vais simplifier, mais je vais la mettre en "commentaire" le temps que le site soit lancé officiellement.

D'ailleurs j'ai hâte de le soumettre dans la rubrique "commentaires" Smiley langue