2016-04-07 12 views
0

Hallo alle Ich arbeite an der db für eine Musik-App und ich habe dies bisher.Kann ich zwei auf einer Datenbank mit zwei Primärschlüsseln auswählen?

Song 
SongId Name Artist 

Playlist 
PlaylistId Name 

Playlist_with_songs 
id (fk)PlaylistId (fk)SongId 

letzte Tabelle beide sind ein Primärschlüssel.

Also frage ich mich, wie meine Abfrage aussehen wird. Bsp. Wenn ich alle Songs mit PlaylistId 5 bekommen möchte, dann müsste ich die eigentlichen Songs aus den Song-Tabellen holen, welche Aussage könnte ich verwenden.

Auch, Ist dies ein gutes Format zu folgen, wenn im Falle einer Playlist gelöscht wird, aber immer noch alle Songs verfügbar. Würde Kaskade dort arbeiten?

Dank (Ich bin mit SQLite.)

+0

Wenn Sie alle Songs mit playlistId 5 erhalten möchten, dann können Sie wie rohe Abfrage verwenden Wählen Sie * aus Song wo SongId IN (wählen Sie SongId aus Playlist_with_songs wo PlaylistId = 5); –

+0

Was Ihre zweite Frage betrifft: "Ist das ein gutes Format, das zu befolgen ist, wenn eine Playlist gelöscht wird, aber immer noch alle Songs verfügbar sind?" Ich denke, es ist gut genug :) Fremdschlüsseleinschränkungen sind standardmäßig nicht aktiviert SQLite sollten Sie es mit db.execSQL aktivieren ("PRAGMA foreign_keys = ON;"); Aber für Ihren Fall glaube ich, dass es gut ist, wenn Sie es nicht aktivieren :) und dann Kaskadenregeln definieren :) Sollte gut funktionieren :) Ich hoffe, ich habe ein wenig Sinn gemacht :) Wie auch immer, http://stackoverflow.com/questions/2545558/ Fremdschlüssel-Einschränkungen-in-android-using-sqlite-on-delete-cascade –

+0

Danke für den Tipp Mann! @SandeepBhandari – Beto

Antwort

1

SQL Teil

Die altmodische Art und Weise:

SELECT * FROM Song 
WHERE SongId IN (
    SELECT SongId FROM Playlist_with_songs 
    WHERE Playlist_id = 5) 

Die moderne Art:

SELECT s.* FROM Song s 
JOIN Playlist_with_songs ps ON ps.SongId = s.SongId 
    AND ps.Playlist_id = 5 

Löschen p art

Genau dieses Muster wird für N: M-Beziehungen verwendet. Sie sollten ON DELETE CASCADE für beide FKs definieren.

+0

hey hast du irgendwelche Links für den modernen Weg. Die erste funktionierte für mich, aber die zweite nicht. Aber ich bin fasziniert, warum das der moderne Weg ist. Danke – Beto

+0

@Beto http://www.halfgaar.net/sql-joins-are-easy –

+0

@Beto vielleicht müssen Sie die Spalten anstelle von s auflisten. * (Einige dbs unterstützen dies nicht) –

0

Wenn Sie alle Songs in einer Playlist enthalten erhalten möchten, können Sie eine Join-Klausel verwenden, das heißt:

SELECT Song.SongId, Song.Name, Song.Artist FROM Playlist_with_songs 
LEFT JOIN Song 
ON Song.SongId = Playlist_with_songs.SongId 
WHERE Playlist_with_songs.PlaylistId = 5; 
+0

@PavelGatnar So dass Sie Erhalte eine einzelne Zeile mit NULL, wenn die Playlist leer ist. Angenommen, das ist das gewünschte Ergebnis ... –

Verwandte Themen