it-swarm.com.ru

Объединить 3 таблицы в базе данных SQLite

У меня есть 3 таблицы в базе данных SQLite:

Песни:

_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 таблицы в одну таблицу?

20
Eng.Fouad

При использовании явного 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
38
Michael Berkowski

Попробуйте этот выбор, может Artists важнее других, поэтому Songs идет через Artists и Albums из 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.

1
Gabriel Lucas

попробуйте sql inner join

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