SELECT sur 3 tables, manque d'entrées

Zayer -  
BadGuitarist Messages postés 373 Statut Membre -
Bonjour,

Voila, en lien avec ce sujet (https://forums.commentcamarche.net/forum/affich-17922270-select-sur-plusieurs-tables voici ma requete MySQL :

SELECT albums.*, artists.*, songs.*
FROM albums, artists, songs
WHERE albums.id_artist = artists.id
AND songs.id_artist = '$artist'
ORDER BY songs.track ASC

Comme je ne sais pas ce qu'est une liaison 1:1, j'ai opté pour la première méthode (du sujet ci-dessus, voir le lien)...

Le but est d'afficher toute les chansons avec l'id de l'artiste et l'id de l'album et d'afficher le nom de l'artiste et le titre de son album avec la liste de tout les chansons de l'album...

Seulement il y a 14 sur 17 chansons qui s'affiche et j'ai vérifié ma table elles ont tous le meme id pour artiste et album.

Quelqu'un peut m'expliquer ce qui cloche dans ma requête SVP?

Merci beaucoup et bonne fin de journée à tous!
A voir également:

2 réponses

BadGuitarist Messages postés 373 Statut Membre 27
 
Bonsoir Zayer,

Il te manque des jointures : pour faire simple, si dans ta clause FROM tu fais appel à n tables, il faut n-1 jointures dans ta clause WHERE.

SELECT albums.*,
artists.*,
songs.*
FROM albums, // 3 tables
artists,
songs
WHERE albums.id_artist = artists.id // 1ière jointure
AND albums.id_artist = songs.id_artist // 2ième jointure
AND songs.id_artist = '$artist'
ORDER BY songs.track ASC

1
Zayer
 
Merci beaucoup BadGuitarist :)

Une derniere chose... Dans la requete, on fusion l'artiste avec l'album et l'artiste avec les chansons. mais comment fusionner les chansons avec l'id de l'album ET l'id de l'artiste... Car dans ce que tu as inscrit en haut, cela ne sélectionne que les chansons d'un artiste si je ne m'abuse :S

Je trouve sa un peu compliquer :S y a-t-il un bon (voir très bon) tuto pour expliquer les fusions de tables?

Merci beaucoup d'avance et merci de la réponse clair et rapide ;)
0
BadGuitarist Messages postés 373 Statut Membre 27
 
Concernant la correction ;

Ne connaissant pas la structure de ta base de données (ou au moins la structure des tables que tu as utilisées dans ta solution), il est fort probable que j'ai pu faire une jointure qui techniquement est correcte mais qui fonctionnellement est inexacte.
Je n'ai fait qu'améliorer ta solution.

Pour que l'on puisse idéalement répondre à ton problème, il faut ;
- nous donner la structure de tes 3 tables
- nous dire EN FRANÇAIS (et non en langage informatique) ce que doit faire le programme.


Concernant des sites :

je vais régulièrement faire un tour chez :
- developpez.com
- w3schools
- le site du zero
0
Zayer
 
Merci énormément pour ton aide... Voici la structure SQL de mes 4 tables :

CREATE TABLE IF NOT EXISTS 'albums' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'id_artist' int(11) NOT NULL,
  'name' varchar(100) NOT NULL,
  'src_image' varchar(100) NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS 'artists' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'name' varchar(100) NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS 'genres' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'name' varchar(100) NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS 'songs' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'id_artist' int(11) NOT NULL,
  'id_album' int(11) NOT NULL,
  'id_genre' varchar(100) NOT NULL,
  'track' int(3) DEFAULT NULL,
  'title' varchar(100) NOT NULL,
  'bitrate' varchar(10) NOT NULL,
  'playtime' varchar(8) NOT NULL,
  'created_on' datetime NOT NULL,
  'released_on' varchar(4) NOT NULL,
  'src_prev' varchar(200) DEFAULT NULL,
  'checksum' varchar(200) DEFAULT NULL,
  PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


J'appel la page avec ?artist=1&album=1 (exemple)
Le script affiche le nom de l'artiste et l'album, puis affiche chaque chanson avec son numéro de piste, l'artiste, la durée, le "bitrate" (ou Taux d'échantillonage / Kbps)...

ensuite jai un autre onglet, (qui appel une page avec jQuery) qui affichera les autre albums de l'artiste (excluant celle de départ) puis un autre onglet qui affichera 50 chansons aux hasard de l'artiste.

Éventuellement j'aimerais mettre un système 5étoiles a coté de chaque piste pour les votes... mais j'y pense encore vue la difficulté que j'ai en ce moment :S

J'ai fais la structure de ma base pour des raisons de flexibilité, malheureusement je me suis aventuré sur un terrain inconnu :(

Merci pour la liste des sites... je fréquente souvent le site du zér0 :)

Merci encore pour ton aide, c'est vraiment TRÈS apprécié...
0
BadGuitarist Messages postés 373 Statut Membre 27
 
Zayer,

1ière remarque sur la structure de la BD :

- La table albums possède l'attribut id_artist (identifiant de l'artiste) donc
la table songs n'a pas besoin de reprendre l'attribut id_artist puisqu'elle possède l'attribut id_album (identifiant de l'album), identifiant qui détermine donc à lui seul l'artiste concerné

- Pour le reste, c'est bien joué surtout si tu t'aventurais en terrain inconnu.


Concernant les fonctionnalités (je ne rentrerais pas dans l'écriture du langage PHP car je ne le connais), :

Le script affiche le nom de l'artiste et l'album,
puis affiche chaque chanson avec son numéro de piste, l'artiste, la durée,
le "bitrate" (ou Taux d'échantillonage / Kbps)...


       SELECT  name
         FROM    artists
         WHERE id = '$artist'

       SELECT  name, src_image, id
         FROM    albums
         WHERE id_artist = '$artist'

       -- pour chaque id retourné par la requête précédente (= pour chaque album
       -- de l'artiste $artist), lancer la requête suivante :

       SELECT track, title, playtime, bitrate
         FROM songs
         WHERE id_album = '$id_courant_retourne_par_requete_precedante'


A+

-----------------------
BG
0
Zayer
 
WOW! Un grand merci! Je n'y avais pas du tout pensé pour l'id de l'album :S MDR

Un grand merci pour ton aide, si jamais j'ai d'autre soucie, c'est toi le premier sur ma liste :)

Merci aussi pour ta patience :)

Bonne soirée ! ;)
0
BadGuitarist Messages postés 373 Statut Membre 27
 
Bonjour Zayer,

Ravi d'avoir pu te rendre service.
A une prochaine ...

BG
0