Mysql ГДЕ проблема с разделенным запятыми списком - PullRequest
5 голосов
/ 16 октября 2010

Мне нужна помощь для решения этой проблемы.

В таблице MYSQL у меня есть поле:

Field  : artist_list  
Values : 1,5,3,401

Мне нужно найти все записи для исполнителя uid 401

Я делаю это

SELECT uid FROM tbl WHERE artist_list IN ('401');

У меня есть все записи, где значения полей artist_list только '401', но если у меня 11,401, этот запрос не совпадает.

Есть идеи?

(Я не могу использовать пользовательский метод LIKE, потому что, если идентификатор исполнителя равен 3 (соответствует 30, 33, 3333) ...

Ответы [ 3 ]

11 голосов
/ 16 октября 2010

Краткосрочное решение

Используйте функцию FIND_IN_SET :

SELECT uid 
  FROM tbl 
 WHERE FIND_IN_SET('401', artist_list) > 0

Долгосрочное решение

Нормализуйте свои данные - это, похоже, отношение многие ко многим, уже включающее две таблицы. Разделенный запятыми список необходимо превратить в собственную таблицу:

ARTIST_LIST

  • artist_id (первичный ключ, внешний ключ для ARTIST)
  • uid (первичный ключ, внешний ключ к TBL)
2 голосов
/ 16 октября 2010

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

uid    artist
1      401
1       11
1        5
2        5
2        4
2        2

Тогда вы можете запросить:

SELECT uid
  FROM table
 WHERE artist = 401

Вам также следует обратить внимание на нормализацию базы данных, потому что то, что у вас есть, в будущем вызовет все больше и больше проблем.

2 голосов
/ 16 октября 2010
SELECT uid
FROM tbl
WHERE CONCAT(',', artist_list, ',') LIKE '%,401,%'

Хотя, во-первых, правильнее будет нормализовать ваши данные.Тогда ваш запрос станет тривиальным и будет иметь намного лучшую производительность.

...