29

SQLiteデータベースに3つのテーブルがあります。

曲:

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

アーティスト:

_id | name

アルバム:

_id | name

次の列で構成されるテーブルのクエリ(Androidアプリで使用)が必要です。

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

ただし、次のクエリステートメントを記述します。

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

しかし、それは私に空のテーブルを与えます。OR代わりに試してみましたがAND、間違った結果が得られました(アーティストは正しいですが、すべての曲が各アルバムで重複しています)。クエリステートメントを修正して、3つのテーブルを1つのテーブルに結合するにはどうすればよいですか?

4

3 に答える 3

60

暗黙的なものの代わりに明示的なものを使用するJOINと、以下は必要なものを取得するはずですが、暗黙的な結合構文が最初に正しい結果を返さなかったのは不思議です。LEFT JOINアーティストやアルバムが関連付けられていない曲を説明するために、を使用しましたが、データセットには必要ない場合があり、INNER JOIN代わりにを使用できます。

また、ほとんどのテーブルに同様の列名があるため、行をフェッチするときのあいまいさを排除するために列エイリアスを追加しました(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
于 2012-07-04T01:32:24.260 に答える
1

この選択を試してみてください。Artists他の人よりも重要である可能性があるため、SongsトラフArtistsAlbumsから来て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

またSongs、特定のアーティストに属するエントリがない場合、またはAlbums特定の曲に属するエントリがない場合でも、のおかげでアーティストエントリを取得できますLEFT JOIN。曲やアルバムを持っているアーティストだけを返したい場合は、JOIN代わりにを使用してください。

于 2015-10-06T14:26:37.350 に答える
0

SQL内部結合を試してください

           inner join Artists on Songs.artist_id = Artists._id
于 2012-07-04T01:39:42.257 に答える