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 JOINWHERE 子句来 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