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