Création
d'entreprise
Posez votre question Signaler

{MySQL} Jointure 3 tables

deletme - Dernière réponse le 13 déc. 2009 à 04:51
Bonjour à toutes et à tous,
J'ai pour objectif de rechercher dans une base de donnée un artiste et ensuite d'afficher les albums qu'il a crée puis les chansons contenues par ce même album :
Voici mes tables :
Artistes : id.artistes ,nom, prenom
Albums : id_albums, nom_albums, id_artistes
Chansons id_chansons, Titre, id_albums
Voici ma requete :
$select = "SELECT * FROM Artistes WHERE nom LIKE '%$Recherche%' OR prenom

								LIKE '%$Recherche%'";
							$result = mysql_query($select,$connexion)
							or die('requete =>'.$select.'<br> error->'.mysql_error());
							$compte = mysql_num_rows(mysql_query($select));							
						 	if($compte>0) {		
			
								$marequete = "SELECT * FROM Artistes WHERE nom LIKE '%$Recherche%' OR prenom

								LIKE '%$Recherche%' IN (AND JOIN Albums ON Artistes.id_artistes=Albums.id_artistes AND JOIN Chansons
								ON Albums.id_albums=Chansons.id_albums)";

								$resultat = mysql_query($marequete,$connexion);

								while($ligne = mysql_fetch_array($resultat))

							 	{

			        				echo "<tr> <td>".$ligne['nom']."</td> <td>" .$ligne['prenom']."</td></tr>";

			   			 	};	
			   			 	}
			   			 	else{
			   					echo "<br> Aucun Artiste ne correspond &agrave; votre recherche";
			   				}	

Erreur sur le mysql_fetch_array donc je presume que ma requete est mauvaise.
Une aide serait la bienvenue,
Cdlt, deletMe
Lire la suite 

{MySQL} Jointure 3 tables »

6 réponses
Réponse
+0
moins plus
$select = "SELECT * FROM Artistes WHERE nom LIKE '%$Recherche%' OR prenom LIKE '%$Recherche%'";
$result = mysql_query($select,$connexion)
	     or die('requete =>'.$select.'<br> error->'.mysql_error());
$compte = mysql_num_rows(mysql_query($select));							
		if($compte>0) {		
			
	$marequete = "SELECT * FROM Artistes WHERE nom LIKE '%$Recherche%' OR prenom
       LIKE '%$Recherche%' IN (AND JOIN Albums ON Artistes.id_artistes=Albums.id_artistes AND JOIN          Chansons ON Albums.id_albums=Chansons.id_albums)";

$resultat = mysql_query($marequete,$connexion);

		while($ligne = mysql_fetch_array($resultat))

		{

	         echo "<tr> <td>".$ligne['nom']."</td> <td>" .$ligne['prenom']."</td></tr>";

		};	
		}
		else{
		echo "<br> Aucun Artiste ne correspond &agrave; votre recherche";
		}	  	   


Désolé ce n'était pas très propre sur mon 1er poste
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

J'ai eu un peu de mal mais je pense que l'erreur vient du fait que tu cherches à joindre des tables dans un prédicat.
ta $marequete devrait-être
$marequete = "
SELECT i.*, a.*, t.*
FROM Artistes i
LEFT JOIN Albums a ON i.id_artistes=a.id_artistes
LEFT JOIN Chansons t ON a.id_albums=t.id_albums
WHERE (nom LIKE '%$Recherche%' OR prenom LIKE '%$Recherche%')
";

Je suis pas très versé dans l'utilisation des JOIN (je me contente de temps à autres de LEFT OUTER JOIN, sans plus). J'ai plutot l'habitude d'utiliser
...
FROM Artistes i, Albums a, Chansons t
WHERE i.id_artistes=a.id_artistes
AND a.id_albums=t.id_albums
...

=> vérifies que LEFT JOIN est accepté tel quel. Sinon essaie LEFT INNER JOIN. Sinon essaie ma syntaxe
deletme - 11 déc. 2009 à 23:19
Merci beaucoup,

Je test cela demain :)

Bonne soirée, deletMe
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Toujours pas d'essai concluant :

"SELECT FROM Artistes LEFT JOIN Albums ON Artistes.id_artistes=Albums.id_artistes
LEFT JOIN Chansons ON Chansons.id_albums=Albums.id_albums
WHERE (nom LIKE '%$Recherche%' OR prenom LIKE '%$Recherche%')";

Je ne vois pas à quoi correspondent les i.* a.* et t.* :s

Sinon sans reprendre mes tables, auriez-vous un exemple pour réaliser mon objectif ?
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Objectif atteint avec cette requête :

"select * from Artistes inner join Albums on Artistes.id_artistes = Albums.id_artistes
inner join Chansons ON Chansons.id_albums=Albums.id_albums
WHERE nom LIKE '%$Recherche%' OR prenom
LIKE '=$Recherche' order by Numero,Nom_Album";

Je sélectionne ma table artiste pour faire la recherche et je lis (verbe lier) les albums et les chansons (tout ça classé par albums et numéro de chansons)



Merci :)
Ajouter un commentaire
Réponse
+0
moins plus
Salut

qqes précisions sur les alias : on est qqes fois un peu fiu de tout taper à la main. alors quand les noms des tables font des kilomètres (genre 4 car ou plus), il peut être utile à la clarté du code de mettre des alias sur les tables.
Dans la requête, j'ai pas envie de taper plein de fois Artistes. Pas non plus envie pour Albums. Encore moins pour Chansons. Je vais donc mettre des alias sur ces tables pour les manipuler dans la requête uniquement à travers leurs alias. Pour Artistes, l'alias sera i. Chaque fois que, dans la requête, je voudrais utiliser Artistes., je mets i. et ça vaut pareil ! Ensuite j'alias Albums avec a => a. signifie Albums. et idem pour Chansons avec t => t. signifie Chansons.
SELECT i.*, a.*, t.*
FROM Artistes i
LEFT INNER JOIN Albums a ON i.id_artistes=a.id_artistes
LEFT INNER JOIN Chansons t ON a.id_albums=t.id_albums
WHERE (nom LIKE '%$Recherche%' OR prenom LIKE '%$Recherche%')
Ajouter un commentaire
Ce document intitulé « {MySQL} Jointure 3 tables » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?