如何通过指定与{songnames.id
相关联的songs
和多个songnames.name
,从artists.name
表格中选择songnames.id
songs
1}}表?
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
('Love')和(多个)songs
('Lukie'从songnames.name
表格中选择artists.name
(ID 3) D','Nitty Kutchie')?
答案 0 :(得分:1)
获取与歌曲名称和艺术家匹配的歌曲。然后按歌曲名称分组,看看你是否匹配每个艺术家。
以下查询查找所有名为'Love'的歌曲,查找'Lukie D'和'Nitty Kutchie',然后只保留由两者执行的'Love'歌曲(即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;