it-swarm.com.de

Verknüpfen Sie 3 Tabellen in der SQLite-Datenbank

Ich habe 3 Tabellen in der SQLite-Datenbank:

Lieder:

_id | name | length | artist_id (foreign key) | album_id (foreign key)

Künstler:

_id | name

Alben:

_id | name

Ich benötige eine Abfrage (in einer Android-App verwenden) einer Tabelle, die aus folgenden Spalten besteht:

_id | name | length | artist_id | artist_name | album_id | album_name

Ich schreibe jedoch die folgende Abfrageanweisung:

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

aber es gibt mir einen leeren Tisch. Ich habe OR anstelle von AND ausprobiert und führt zu falschen Ergebnissen (jedes Lied dupliziert sich in jedem Album, obwohl der Interpret korrekt ist). Wie kann ich meine Abfrageanweisung korrigieren, um die 3 Tabellen in einer einzigen Tabelle zu verknüpfen?

20
Eng.Fouad

Wenn Sie eine explizite JOIN anstelle einer impliziten verwenden, sollte das Folgende das bekommen, was Sie möchten, obwohl es merkwürdig ist, dass Ihre implizite Verknüpfungssyntax an erster Stelle keine korrekten Ergebnisse zurückgab. Ich habe einen LEFT JOIN verwendet, um Songs zu berücksichtigen, denen kein Künstler oder Album zugeordnet ist, die jedoch für Ihren Datensatz möglicherweise nicht erforderlich sind. Stattdessen könnte ein INNER JOIN verwendet werden.

Ich habe auch Spaltenaliase hinzugefügt, um die Mehrdeutigkeit beim Abrufen von Zeilen zu beseitigen, da in den meisten Ihrer Tabellen ähnliche Spaltennamen vorhanden sind (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

Versuchen Sie diese Auswahl, durch die Artists ist wichtiger als andere, so dass die Songs durch Artists und Albums von Songs kommt.

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

Auch wenn es keinen Eintrag in Songs gibt, der zu einem bestimmten Interpreten gehört, oder keinen Eintrag in Albums, der zu einem bestimmten Song gehört, erhalten Sie den Interpreten-Eintrag trotzdem dank LEFT JOIN. Wenn Sie nur Interpreten mit Liedern und Alben zurückgeben möchten, verwenden Sie stattdessen JOIN.

1
Gabriel Lucas

versuchen Sie es mit dem inneren Join von SQL

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