2012-03-21 5 views
2

Мне нужно иметь 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%'; 

Edit:

Вот пример базы данных;

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

Настольные песни не имеют 'artistID'? – safarov

+0

@safarov У них нет, но я мог бы добавить это. – Flipper

+0

Если нет, то как вы определяете, какая песня принадлежит художнику – safarov

ответ

3

Этот запрос будет получать соответствие артистов, песни и альбомы. Первый столбец дает представление о происхождении данных, второй - 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%' 
+0

Это прекрасно работает! Благодаря! – Flipper

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 также может быть использован, но это не может дать вам результаты, которые вы хотите. Левое соединение даст вам строку для каждой песни, которая соответствует художнику, альбому или песне. Союз даст вам строку для каждой песни, где она соответствует названию песни, строке для каждого альбома, где она соответствует названию альбома, и строке для каждого исполнителя, которая соответствует имени исполнителя.

-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%' 
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%' 
) 
+0

с типом столбцом также в выборе очень хорошая идея. –

+0

Я получил эту ошибку при попытке: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса, используемого рядом с «WHERE» artist.'name' LIKE '% snoop') UNION (SELECT 'в строке 6 – Flipper

+0

А также, как тип отличается от OriginatingTable в ответе Николы? – Flipper

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

Таким образом, вы избегаете получения комбинации всех таблиц, а также у вас есть вся информация в каждой строке.

Смежные вопросы