web-dev-qa-db-fra.com

Joindre 3 tables dans la base de données SQLite

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?

20
Eng.Fouad

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
38
Michael Berkowski

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.

1
Gabriel Lucas

essayez sql joint interne

           inner join Artists on Songs.artist_id = Artists._id
0
user1492669