J'ai 3 tables dans la base de données SQLite:
Chansons:
_id | name | length | artist_id (foreign key) | album_id (foreign key)
Artistes:
_id | name
Albums:
_id | name
J'ai besoin d'une requête (à utiliser dans une application Android) d'une table composée des colonnes suivantes:
_id | name | length | artist_id | artist_name | album_id | album_name
Cependant, j'écris l'instruction de requête suivante:
SELECT Songs._id, Songs.name, Songs.length, Songs.artist_id, Artists.name, Songs.album_id, Albums.name FROM Songs, Artists, Albums WHERE Songs.artist_id = Artists._id AND Songs.album_id = Albums._id
mais cela me donne une table vide. J'ai essayé OR
au lieu de AND
et cela donne des résultats incorrects (chaque chanson est dupliquée dans chaque album, bien que l'artiste soit correct). Comment puis-je corriger mon instruction de requête pour joindre les 3 tables d'une seule table?
En utilisant une JOIN
explicite au lieu d'une implicite, les éléments suivants devraient obtenir ce que vous voulez, bien qu'il soit curieux que votre syntaxe de jointure implicite n'ait pas renvoyé des résultats corrects. J'ai utilisé un LEFT JOIN
pour comptabiliser des chansons qui n'ont pas d'artiste ou d'album associé, mais cela peut ne pas être nécessaire pour votre ensemble de données et un INNER JOIN
pourrait être utilisé à la place.
J'ai également ajouté des alias de colonnes pour éliminer toute ambiguïté lors de l'extraction de lignes, car vous avez des noms de colonnes similaires dans la plupart de vos tables (id, name
).
SELECT
Songs._id AS song_id,
Songs.name AS song_name,
Songs.length,
Songs.artist_id AS artist_id,
Artists.name AS artist_name,
Songs.album_id AS album_id,
Albums.name AS album_name
FROM
Songs
LEFT JOIN Artists ON Songs.artist_id = Artists._id
LEFT JOIN Albums ON Songs.album_id = Albums._id
Essayez cette sélection, car la Artists
est plus importante que d’autres, de sorte que la Songs
vienne de Artists
et Albums
de Songs
.
SELECT
Songs._id AS song_id,
Songs.name AS song_name,
Songs.length,
Songs.artist_id AS artist_id,
Artists.name AS artist_name,
Songs.album_id AS album_id,
Albums.name AS album_name
FROM
Artists
LEFT JOIN Songs ON Songs.artist_id = Artists._id
LEFT JOIN Albums ON Songs.album_id = Albums._id
De même, s'il n'y a aucune entrée dans Songs
appartenant à un artiste particulier ou aucune entrée dans Albums
appartenant à une chanson particulière, vous obtiendrez toujours l'entrée de l'artiste grâce au LEFT JOIN
. Si vous souhaitez renvoyer uniquement les artistes avec des chansons et des albums, utilisez plutôt JOIN
.
essayez sql joint interne
inner join Artists on Songs.artist_id = Artists._id