MySQL 连接有问题
Having trouble with MySQL joins
艺术家table:
Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL |
歌曲table:
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(80) | YES | | NULL | |
| minutes | int(11) | YES | | NULL | |
| seconds | int(11) | YES | | NULL | |
| sales | decimal(5,2) | NO | | 0.00 | |
| genre_id | int(11) | NO | MUL | NULL |
和我的路口table song_artist:
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| song_id | int(11) | NO | PRI | NULL | |
| artist_id | int(11) | NO | PRI | NULL
所以我的数据中有没有歌曲的艺术家和没有艺术家的歌曲。我可以使用先左后右的外连接让没有歌曲的艺术家出现,但我似乎无法以相反的方式获取数据。
我一直在尝试使用此代码来获取我 table 中没有任何艺术家的歌曲:
SELECT songs.title, artists.name
-> FROM songs
-> RIGHT JOIN song_artist
-> ON (songs.id = song_artist.song_id)
-> RIGHT JOIN artists
-> ON (artists.id = song_artist.artist_id);
但这行不通。我需要所有歌曲的标题和艺术家姓名才能显示在我的结果中。
我需要这样的结果:
title | name |
+-----------------------+-------------------------------+
| Under Pressure | Queen |
| Let It Be | Beatles |
| Broadway | Goo Goo Dolls |
| I Hope You Dance | Lee Ann Womack |
| Turn Off The Light | Nelly Furtado |
| I'm Like a Bird | Nelly Furtado |
| Canon in D | Barrymoore Chamber Orchestra |
| Canon in D | London Philharmonic Orchestra |
| Star Wars | London Philharmonic Orchestra |
| Sea Drift | London Philharmonic Orchestra |
| NULL | Pop Evil |
| NULL | Volbeat |
| NULL | Godsmack |
但是我的名字类别需要 NULL 而不是我的标题类别
要获取没有任何艺术家的歌曲,您可以使用not exists
:
select s.*
from songs s
where not exists (
select 1
from song_artist sa
inner join artist a on a.id = sa.artist_id
where sa.song_id = s.id
)
这包括以下情况:
song_artist
中没有给定歌曲的条目
- 给定歌曲在
song_artist
中有一个(或多个)条目,但引用的 artist_id
(s) 的 none 可以在 table artist
对于这种情况,您可以使用 LEFT JOIN
和 WHERE
子句来 return 不匹配的行。
没有艺术家的歌曲:
SELECT songs.*
FROM songs LEFT JOIN song_artist
ON song_artist.song_id = songs.id
WHERE song_artist.song_id IS NULL
编辑
如果您想要所有歌曲,包括有的歌曲和没有的歌手, 那么:
SELECT songs.title, artists.name
FROM songs
LEFT JOIN song_artist ON song_artist.song_id = songs.id
LEFT JOIN artists ON song_artist.artist_id = artists.id
艺术家table:
Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL |
歌曲table:
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(80) | YES | | NULL | |
| minutes | int(11) | YES | | NULL | |
| seconds | int(11) | YES | | NULL | |
| sales | decimal(5,2) | NO | | 0.00 | |
| genre_id | int(11) | NO | MUL | NULL |
和我的路口table song_artist:
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| song_id | int(11) | NO | PRI | NULL | |
| artist_id | int(11) | NO | PRI | NULL
所以我的数据中有没有歌曲的艺术家和没有艺术家的歌曲。我可以使用先左后右的外连接让没有歌曲的艺术家出现,但我似乎无法以相反的方式获取数据。 我一直在尝试使用此代码来获取我 table 中没有任何艺术家的歌曲:
SELECT songs.title, artists.name
-> FROM songs
-> RIGHT JOIN song_artist
-> ON (songs.id = song_artist.song_id)
-> RIGHT JOIN artists
-> ON (artists.id = song_artist.artist_id);
但这行不通。我需要所有歌曲的标题和艺术家姓名才能显示在我的结果中。
我需要这样的结果:
title | name |
+-----------------------+-------------------------------+
| Under Pressure | Queen |
| Let It Be | Beatles |
| Broadway | Goo Goo Dolls |
| I Hope You Dance | Lee Ann Womack |
| Turn Off The Light | Nelly Furtado |
| I'm Like a Bird | Nelly Furtado |
| Canon in D | Barrymoore Chamber Orchestra |
| Canon in D | London Philharmonic Orchestra |
| Star Wars | London Philharmonic Orchestra |
| Sea Drift | London Philharmonic Orchestra |
| NULL | Pop Evil |
| NULL | Volbeat |
| NULL | Godsmack |
但是我的名字类别需要 NULL 而不是我的标题类别
要获取没有任何艺术家的歌曲,您可以使用not exists
:
select s.*
from songs s
where not exists (
select 1
from song_artist sa
inner join artist a on a.id = sa.artist_id
where sa.song_id = s.id
)
这包括以下情况:
song_artist
中没有给定歌曲的条目- 给定歌曲在
song_artist
中有一个(或多个)条目,但引用的artist_id
(s) 的 none 可以在 tableartist
对于这种情况,您可以使用 LEFT JOIN
和 WHERE
子句来 return 不匹配的行。
没有艺术家的歌曲:
SELECT songs.*
FROM songs LEFT JOIN song_artist
ON song_artist.song_id = songs.id
WHERE song_artist.song_id IS NULL
编辑
如果您想要所有歌曲,包括有的歌曲和没有的歌手, 那么:
SELECT songs.title, artists.name
FROM songs
LEFT JOIN song_artist ON song_artist.song_id = songs.id
LEFT JOIN artists ON song_artist.artist_id = artists.id