2016-12-05 17 views
0

Как выбрать songnames.id из songs таблицы, указав songnames.name и мультипликатор artists.name, которые связаны с songnames.id в songs таблице?Как выбрать songnames.id из таблицы композиций в этой конкретной макете базы данных?

CREATE TABLE songnames (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(255) NOT NULL, 
    alias VARCHAR(255) 
) ENGINE = 'InnoDB' DEFAULT CHARSET = 'UTF8'; 

CREATE TABLE artists (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(255) UNIQUE NOT NULL 
) ENGINE = 'InnoDB' DEFAULT CHARSET= 'UTF8'; 

CREATE TABLE songs (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    artist_id INT UNSIGNED NOT NULL REFERENCES artists(id) ON UPDATE CASCADE ON DELETE CASCADE, 
    songname_id INT UNSIGNED NOT NULL REFERENCES songnames(id) ON UPDATE  CASCADE ON DELETE CASCADE, 
    UNIQUE(artist_id, songname_id) 
) ENGINE = 'InnoDB' DEFAULT CHARSET = 'UTF8'; 


songs table:      artists table: 

+----+-----------+-------------+ +----+---------------+ 
| id | artist_id | songname_id | | id |  name  | 
+----+-----------+-------------+ +----+---------------+ 
| 1 |  1  |  1  | | 1 | Matt White | 
+----+-----------+-------------+ +----+---------------+ 
| 2 |  2  |  2  | | 2 | Keyshia Cole | 
+----+-----------+-------------+ +----+---------------+ 
| 3 |  3  |  3  | | 3 | Nitty Kutchie | 
+----+-----------+-------------+ +----+---------------+ 
| 4 |  4  |  3  | | 4 | Lukie D  | 
+----+-----------+-------------+ +----+---------------+ 
| 5 |  5  |  4  | | 5 | Sia   | 
+----+-----------+-------------+ +----+---------------+ 

songnames table: 

+----+--------------+--------------+ 
| id |  name  |  alias | 
+----+--------------+--------------+ 
| 1 | Love   |   NULL | 
+----+--------------+--------------+ 
| 2 | Love   |   NULL | 
+----+--------------+--------------+ 
| 3 | Love   | Must Be Love | 
+----+--------------+--------------+ 
| 4 | The Greatest |   NULL | 
+----+--------------+--------------+ 

This SQL Fiddle является то, что я играл с до сих пор, я просто не могу найти способ, чтобы выбрать songname_id по данным artists.name и songnames.name.

Это, кажется, работает:

SELECT DISTINCT 
    songnames.id 
FROM songs 
JOIN songnames ON songs.songname_id = songnames.id 
JOIN artists ON songs.artist_id = artists.id 
WHERE songnames.name = 'Love' AND artists.name = 'Matt White' 

Но мне нужно что-то похожа на (это один явно не исполняет):

SELECT DISTINCT 
    songnames.id 
FROM songs 
JOIN songnames ON songs.songname_id = songnames.id 
JOIN artists ON songs.artist_id = artists.id 
WHERE songnames.name = 'Love' AND artists.name = 'Lukie D' AND artists.name = 'Nitty Kutchie' 

Как выбрать songnames.id (ID 3) из стол songs, указав songnames.name ('Любовь') и (несколько) artists.name ('Lukie D', 'Nitty Kutchie')?

ответ

1

Получите песни, соответствующие названию песни и художнику. Затем выберите группу по имени песни и посмотрите, есть ли у вас матч для каждого исполнителя.

Следующий запрос просматривает все песни под названием «Любовь», ищет «Lukie D» и «Nitty Kutchie», а затем сохраняет только одну песню «Любовь», которую выполняют оба (то есть count(*) = 2) артистов.

select songname_id 
from songs 
where songname_id in (select id from songnames where name = 'Love') 
and artist_id in (select id from artists where name in ('Lukie D', 'Nitty Kutchie')) 
group by songname_id 
having count(*) = 2; 

SQL скрипка: http://sqlfiddle.com/#!9/fde558/10

+0

Спасибо, что это именно то, что я пытаюсь выяснить! – phew