2012-07-04 16 views
16

mam 3 tabele w SQLite database:Dołącz 3 tabel w bazie danych SQLite

piosenek

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

artystów:

_id | name 

albumów:

_id | name 

muszę zapytanie (używać go w Android app) z tabeli, która składa się z następujących kolumn:

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

Jednak piszę następujące oświadczenie zapytanie:

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 

ale daje mi pusty stolik. Próbowałem OR zamiast AND i daje on nieprawidłowe wyniki (każda piosenka jest duplikowana w każdym albumie, chociaż artysta jest poprawny). W jaki sposób mogę poprawić oświadczenie zapytania, aby dołączyć do 3 tabel w jednej tabeli?

Odpowiedz

33

Używając jawnego JOIN zamiast domyślnego, poniższe powinny otrzymać to, co chcesz, chociaż jest to ciekawe, że niejawna składnia łączenia nie zwróciła poprawnych wyników w pierwszej kolejności. Użyłem numeru LEFT JOIN, aby uwzględnić utwory, które nie mają powiązanego artysty lub albumu, ale może to nie być konieczne dla twojego zestawu danych, a zamiast tego może zostać użyty INNER JOIN.

Dodałem także aliasów kolumn do wyeliminowania niejasności podczas pobierania wierszy, ponieważ mają podobne nazwy kolumn w większości tabel (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 
+0

Właśnie napisałem to samo. Ale prawdopodobnie będzie potrzebował "LEFT JOIN" na wypadek, gdyby utwór nie zawierał tagu na Arist lub Album. – mawburn

+0

@MadBurn Właśnie zmieniałem ten –

+0

Działa po prostu świetnie. Bardzo to doceniam. Dzięki :) –

0

spróbować sql sprzężenia wewnętrznego

  inner join Artists on Songs.artist_id = Artists._id 
1

Spróbuj select, maja przez Artists jest ważniejsze niż inne, więc Songs przyjść koryta Artists i Albums z 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 

Także jeśli nie ma wpisu w Songs przynależności do konkretnego artysty lub bez wpisu Albums należącego do konkretnego utworu, będzie nadal uzyskać wpis artysta dzięki LEFT JOIN. Jeśli chcesz zwrócić tylko wykonawców z utworami i albumami, użyj zamiast tego JOIN.

Powiązane problemy