2013-03-06 5 views
1

У меня есть таблица художников и таблица artist_alias. artist_alias содержит все возможные имена для художников.Подзапрос, возвращающий более 1 строки?

Моего запроса, чтобы захватить художник данные на нескольких художников, выглядит следующим образом:

$sql = "SELECT artist.artist_id, artist.artist_name 
     FROM artists artist 
     WHERE artist.artist_id IN (3,9,500);"; 

Теперь я хочу, чтобы также включать в себя любые известные псевдонимы, которые могут быть 1 или X. Могу ли я Fetch этой информации в пределах запрос выше? Или это отдельный запрос?

Я думал о делать что-то вроде:

$sql = "SELECT artist.artist_id, artist.artist_name, 
     (SELECT * FROM artists_alias WHERE [???])...."; 

Но я получаю сообщение об ошибке «подзапрос возвращает более чем на 1 строку» - я делаю это гораздо сложнее, чем это? Может ли это быть один запрос?

Я был бы счастлив иметь псевдонимы через запятую, так, например, возвращение строка может выглядеть следующим образом: 3, «Бен складки пять», «Бен складки пять, benfolds, Бен складки пять, складывает пять»

ответ

4

Вам понадобится LEFT JOIN против artist_alias, чтобы получить их. И если вы хотите, чтобы они были разделены запятыми, используйте совокупность GROUP_CONCAT().

LEFT JOIN используется так, чтобы строка возвращалась, даже если у исполнителя нет связанных с ним псевдонимов.

Одна строка на псевдоним (который дублирует информацию об исполнителе на строку):

SELECT 
    artist.artist_id, 
    artist.artist_name, 
    /* Retrieves all cols from artists_alias. SELECT only what you need... */ 
    artists_alias.* 
FROM 
    artist 
    /* Assuming there's an artists_alias.artist_id. Substitute the correct column name */ 
    LEFT JOIN artists_alias ON artist.artist_id = artists_alias.artist_id 
WHERE artist.artist_id IN (3, 9, 500) 

Или разделенный запятыми список псевдонимов через GROUP_CONCAT():

SELECT 
    artist.artist_id, 
    artist.artist_name, 
    /* Substitute the correct column name for the actual alias */ 
    GROUP_CONCAT(artists_alias.alias) AS all_aliases 
FROM 
    artist 
    LEFT JOIN artists_alias ON artist.artist_id = artists_alias.artist_id 
WHERE artist.artist_id IN (3, 9, 500) 
GROUP BY 
    artist.artist_id, 
    artist.artist_name 
+0

Ах, это замечательно! Спасибо много! По какой-то причине я думал, что LEFT JOIN не будет захватывать ВСЕ значения. Shrug. – Mike

-1

предел положить 1 в конце.

выбрать * из tble где a = 1 предел 1;

+0

Это фактически не решает проблему, она просто маскирует симптом. –

2

Если вы хотите вернуть все псевдонимы в одной строке, а затем использовать group_concat():

SELECT a.artist_id, a.artist_name, 
     group_concat(aa.alias) as aliases 
FROM artists artist left outer join 
    artists_alias aa 
    on a.artist_id = aa.artist_id 
WHERE at.artist_id IN (3,9,500) 
group by a.artist_id, a.artist_name 
+0

спасибо! очень признателен! – Mike

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