SELECT sur 3 tables, manque d'entrées
Zayer
-
BadGuitarist Messages postés 373 Statut Membre -
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!
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:
- SELECT sur 3 tables, manque d'entrées
- Ai suite 3 - Télécharger - Optimisation
- :3 emoji ✓ - Forum Mail
- Tables des matières word - Guide
- Picasa 3 - Télécharger - Albums photo
- Photorecit 3 - Télécharger - Visionnage & Diaporama
2 réponses
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
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
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 ;)
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 ;)
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
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
Merci énormément pour ton aide... Voici la structure SQL de mes 4 tables :
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é...
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é...
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)...
A+
-----------------------
BG
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