搜索多个表(SQL)

时间:2012-03-21 23:47:13

标签: php mysql sql

我需要能够使用简单搜索来搜索我的数据库的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”这样的搜索将艺术家和歌曲归还。

5 个答案:

答案 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%'