Присоедините 3 таблицы в базе данных SQLite - программирование

Присоедините 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 таблицам в одной таблице?

4b9b3361

Ответ 1

Используя явный 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

Ответ 2

Попробуйте этот выбор, возможно, с помощью 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 вместо этого.

Ответ 3

попробуйте встроенное соединение sql

           inner join Artists on Songs.artist_id = Artists._id