{MySQL} Jointure 3 tables [Fermé]

Signaler
-
 fiu -
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

5 réponses

$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
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
Merci beaucoup,

Je test cela demain :)

Bonne soirée, deletMe
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 ?
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 :)
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%')