我需要能够使用简单搜索来搜索我的数据库的SQL查询。这是我的表现在的样子:
Table artists
--------------
id
name
Table albums
-------------
id
artistID
name
Table songs
------------
id
albumID
name
我该怎么做呢?以下是我尝试过的一些SQL查询,但我的问题是它返回了大量数据。例如,如果我搜索像Snoop Dogg这样的艺术家,即使他们没有包含他的名字,也会为每张专辑和歌曲返回一行。
SELECT * FROM artist,album,songs WHERE artist.name LIKE '%snoop%' OR albums.name LIKE '%snoop%' OR songs.name LIKE '%snoop%';
编辑:
这是一个示例数据库;
artists
-----------
1 | Snoop Dogg
2 | Linkin Park
albums
--------
1 | artist=1 | Boom
2 | artist=2 | ThisIsIt
songs
--------
1 | album=1 | First
2 | album=2 | Second Linkin
3 | album=2 | Third
4 | album=1 | Fourth
所以我想搜索“snoop”来回归艺术家“Snoop Dogg”。但随后像“Linkin”这样的搜索将艺术家和歌曲归还。
答案 0 :(得分:4)
此查询将检索匹配的艺术家,歌曲和专辑。第一列给出了关于数据来源的线索,第二列是id,最后一个是名称。
select 'Artists' OriginatingTable, id, name
from artists
where name like '%snoop%'
union all
select 'Albums', id, name
from albums
where name like '%snoop%'
union all
select 'Songs', id, name
from songs
where name like '%snoop%'
答案 1 :(得分:4)
以下使用UNION
,从而避免了JOIN
s:
(
SELECT
'artist' as `type`,
`artists`.`id` as `id`,
`artists`.`name` as `name`
FROM `artists`
WHERE
`artists`.`name` LIKE '%snoop%'
)
UNION
(
SELECT
'album' as `type`,
`albums`.`id` as `id`,
`albums`.`name` as `name`
FROM `albums`
WHERE
`albums`.`name` LIKE '%snoop%'
)
UNION
(
SELECT
'song' as `type`,
`songs`.`id` as `id`,
`songs`.`name` as `name`
FROM `songs`
WHERE
`songs`.`name` LIKE '%snoop%'
)
答案 2 :(得分:2)
您需要将所有数据连接在一起,以便它成为一个大数据集,允许您一次查询所有字段。要执行此操作,您需要使用left join,这是此方案中最佳的。
SELECT *
FROM songs
LEFT JOIN albums
ON songs.albumID = albums.id
LEFT JOIN artists
ON albums.artistID = artists.id
WHERE artist.name LIKE '%snoop%'
OR albums.name LIKE '%snoop%'
OR songs.name LIKE '%snoop%';
也可以使用union,但这可能无法为您提供所需的结果。左连接将为每首与艺术家,专辑或歌曲匹配的歌曲提供一行。联盟将为每首歌曲提供一行,其中它与歌曲名称匹配,每个专辑与专辑名称匹配的行,以及每个艺术家与艺术家名称匹配的行。
答案 3 :(得分:0)
您应该从每个表中选择并返回和结合结果,但请记住,所有选择必须返回相同数量和类型的列。
SELECT 'Artist' as kind, id as artistId, name, null as albumId, null as SongId
FROM artist WHERE artist.name LIKE '%snoop%'
union
SELECT 'Album', artistId, name, id, null FROM album WHERE albums.name LIKE '%snoop%'
union
SELECT 'Song', albums.artistId, songs.name, songs.albumId, songs.id
FROM songs inner join albums on songs.albumId = albums.id
WHERE songs.name LIKE '%snoop%'
这样您就可以避免获得所有表格的组合,并且每行还包含所有可用信息。
答案 4 :(得分:-1)
此查询搜索艺术家姓名,歌曲名称和专辑名称
SELECT artist.name,albums.name,songs.name
FROM songs
LEFT JOIN album ON album.id = song.albumID
LEFT JOIN artists ON album.artistID = artists.id
WHERE
artist.name LIKE '%snoop%' OR albums.name LIKE '%snoop%' OR songs.name LIKE '%snoop%'