如何从此特定数据库布局中的歌曲表中选择songnames.id?

时间:2016-12-05 16:29:06

标签: mysql sql

如何通过指定与{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_idartists.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')?

1 个答案:

答案 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;

SQL小提琴:http://sqlfiddle.com/#!9/fde558/10