faire une requête avec une jointure et un LIKE ?

Eléphant du PHP | 215 Messages

26 oct. 2010, 21:34

Salut à tous, je souhaite faire une requête avec une jointure et un LIKE mais je n'y parviens pas, voici un aperçu de mes deux tables concernés :
Image

Voici ce que je souhaiterais faire :

Je veux récupérer dans ma table "articles" les articles ayant leur "id" présent dans "articles" de la table "categories" pour le "theme" : Nos cadeaux stars.


Pour l'exemple je pourrais donc afficher dans ma rubrique "Nos cadeaux stars" grâce à un while les articles portant l'id 5, 12, 22 et 24

Et voici ce que j'ai fais pour l'instant (mes jointures on lair de fonctionner alors le problême doit venir de la ligne avec le LIKE) :


<?php
  /******************************************************************/
 /*** Affiche les articles lorsque la catégorie est cadeaux stars
/******************************************************************/
$reponse = $bdd->query("
						SELECT articles.id, articles.titre, articles.ancien_prix, articles.prix, articles.image, articles.ordre
						FROM articles, categories
						WHERE categories.articles LIKE '%,articles.id,%' = articles.id
						AND categories.id = 1
						ORDER BY ordre, RAND()
						");
$reponse->setFetchMode(PDO::FETCH_ASSOC);



while( $articles = $reponse->fetch() )
{
	?>
	<div id="acticle_boite">
		<a href="templates/pages/etape1_description.php?id=<?php echo $articles['id']; ?>"><img src="interface/articles/<?php echo $articles['image']; ?>.jpg" alt="<?php echo $articles['titre'] . '.'; ?>" /></a>
		<a href="templates/pages/etape1_description.php?id=<?php echo $articles['id']; ?>"><p class="titre"><?php echo $articles['titre']; ?></p></a>
		<p>
			<span class="ancien_prix"><?php echo $articles['ancien_prix'] . ' €'; ?><br /></span>
			<span class="prix"><?php echo $articles['prix'] . ' €'; ?></span>
		</p>
	</div>
	<?php
}
?>
Cadeaux personnalisés d'après photos, gravure...
http://www.cadeauxplaisir.com/

Eléphant du PHP | 74 Messages

26 oct. 2010, 21:44

LIKE s'utilise avec une chaîne de caractères.
Dans ton cas tu dois choisir les articles selon une liste d'id (5, 12, 22 et 24)
Pour cela..tu peux utiliser un IN.
categories.articles IN (5,12,22,24)
Edit : oups ^^ j'avais pas bien regardé ta structure...je remodifie dès que je trouve

Edit : D'après moi tu as deux solutions :

1> Tu fais en deux requêtes.

La première permet d'obtenir le champ articles. Ensuite tu concatenes en php ce résultat avec la requête que tu as proposé en utilisant IN.

2> Plus conventionnel : Tu crées une table qui permet de lier à une catégorie plusieurs articles.

Eléphant du PHP | 215 Messages

27 oct. 2010, 14:09

Merci d'avoir pris du temp pour m'aider. Ta première solution serait pour moi la plus adapté mais en faisant un IN ca considère 5,12,22,24 comme un bloc et non pas comme une suite de chiffre. Il faudrait peu etre que je fasse une sorte de rejex mais trop compliqué, j'vai donc tenter autre chose mais merci quand meme pour ton aide :wink:
Cadeaux personnalisés d'après photos, gravure...
http://www.cadeauxplaisir.com/

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10455 Messages

27 oct. 2010, 22:23

En fait tu as surtout un problème de conception dans ta base de données. Les relations 1::N (comprendre qu'à un enregistrement d'une table peuvent être associées N enregistrements de l'autre table) doivent être gérées en base à l'aide d'une table intermédiaire.

L'idée est donc d'avoir une table lien_categorie_article constituée de deux champs : id_categorie et id_article. Celle-ci contient chacune des associations sous forme d'enregistrement. Pour reprendre ton exemple, elle devrait donc contenir les couples suivants : (1, 5) (1, 12) (1, 22) (1, 24)

Ceci te permet de récupérer facilement tous les ids des articles associés à la catégorie dont l'id est 1, mais également toutes les catégories auxquelles l'id article 12 ou 24 peuvent être associés. Dès lors, plus besoin de LIKE et de construction complexe, une simple jointure sur tes 3 tables te permet d'avoir toutes les infos dont tu peux avoir besoin :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 215 Messages

27 oct. 2010, 23:30

oké j'vais essayer tout ça, merci beaucoup de votre aide :wink:
Cadeaux personnalisés d'après photos, gravure...
http://www.cadeauxplaisir.com/