2016-11-29 3 views
1

Я новичок в mysql. И я прочитал this и несколько других о stackoverflow. Все они предлагают использовать LIKE, но я все еще не могу получить правильный результат. Интересно, возникает ли проблема из-за разных строк, содержащих информацию.Как сравнить значение атрибута в одном столбце с каждым в столбце inther в mysql?

Пусть у меня есть talbe CD вроде этого:

artist  album 
Prince  Purple Rain 
Adam   Prince Charming 

И я хочу, чтобы выбрать художника Prince, так как она и в исполнителе, альбоме, я попытался с помощью: SELECT artist from CD WHERE album LIKE CONCAT('%', artist, '%')

Но продолжал возвращаться 0, и я не понимаю, почему это не работает, кто-нибудь может мне помочь?

редактировать: Более подробная информация о «TABLE CD»:

artist  album 
Prince  Purple Rain 
Adam   Prince Charming 
James   Apple 
Furious  Banana 
Beatles  Let It Be 
It   Come 

И он должен вернуть художник Prince, It

+0

Я думаю, что вы должны передать переменную PHP в запросе: ' "SELECT ... WHERE альбом LIKE «%". $ connection-> escape ($ artist). "% '" '. Но описание неясно. Возможно, вы имели в виду какое-то ПРИСОЕДИНЕНИЕ. –

+0

Какой вывод вы хотите, чтобы предоставить пример. –

+1

Вывод должен быть художником 'Prince', так как он находится в столбце' artist' и колонке 'album' –

ответ

1

Это может помочь вам, попробуйте этот

SELECT artist FROM yourTable WHERE (SELECT GROUP_CONCAT(album) FROM yourTable) LIKE CONCAT('%',artist,'%'); 

SQL Fiddle

GROUP_CONCAT

Эта функция возвращает строковый результат с объединенными значениями, отличными от NULL, из группы (т. Е. Из результата вашего запроса). Он возвращает NULL, если нет значений, отличных от NULL.

Для получения более подробной информации о GROUP_CONCAT увидеть это MySQL documentation и this

+0

Это работает! Спасибо! –

0

Если вы хотите сравнить коллекции записей с коллекциями других записей, то простыми LIKE сравнения в предложении WHERE не хватит. Вместо этого вам придется выполнять какую-то агрегацию по всем записям. Следующий запрос вернет true, если 'Prince' появляется один или несколько раз в столбцах и album.

SELECT CASE WHEN EXISTS (
    SELECT * FROM yourTable 
    HAVING SUM(CASE WHEN artist LIKE '%Prince%' THEN 1 ELSE 0 END) > 0 AND 
      SUM(CASE WHEN album LIKE '%Prince%' THEN 1 ELSE 0 END) > 0 
) THEN "True" ELSE "False" END 

Демо здесь:

SQLFiddle

+0

Привет, спасибо, что ответили. Но что, если есть другой художник по имени, кроме «Принца»? –

+0

Привет, я добавил еще несколько случаев для разъяснения –

+0

@ DexD.Hunter Вам может понадобиться использовать полнотекстовый поиск/динамический SQL, если вы хотите вернуть список общих строк. –

0

Вы можете сделать левое соединение с той же таблицей и использовать как условие присоединиться к ним.

SELECT 
    t1.artist, 
    t2.album 
FROM 
    artists t1 
    left join 
     artists t2 
     on t2.album LIKE concat('%', t1.artist, '%') 
where 
    t2.album is not NULL 
group by 
    t1.artist 

SQLFiddle

+0

Это работает, спасибо, спасибо! –

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