Ваш лучший выбор - нормализовать ваши данные.Хранение наборов чисел в виде списков, разделенных запятыми, считается вредным в SQL.Почему вредно?
- он плохо масштабируется, потому что не может использовать индексы для поиска
- обновить наборы чисел сложно;рассмотрим проблему удаления
2
из 1,2,3,4
.В SQL это беспорядок.
Некоторые варианты SQL поддерживают функцию обновления.Но проблема масштабирования все еще существует.(Не обижайтесь на этот совет: большинство из нас в тот или иной момент допустили эту ошибку при проектировании базы данных.)
Между профилями и хобби у вас есть отношение многие ко многим.Поэтому вам нужна таблица с именем profile_hobbie
с двумя столбцами, p_id
и h_id
.Когда профиль начинает заниматься хобби, вы вставляете строку в profile_hobbie
с идентификатором профиля и хобби.Если профиль перестает заниматься хобби, вы удаляете эту строку.
Тогда ваш запрос будет выглядеть следующим образом:
SELECT hobbie.h_name
FROM profile
JOIN profile_hobbie ON profile.p_id = profile_hobbie.p_id
JOIN hobbie ON profile_hobbie.id = hobbie.h_id
WHERE profile.p_id=37
Это даст (возможно, пустой) список хобби для выбранного профиля.
Вы также можете попробовать использовать Функция MySQL FIND_IN_SET () , но вы можете столкнуться с проблемами преобразования между целыми числами и строками.
SELECT hobbie.h_name
FROM profile
JOIN hobbie ON (FIND_IN_SET(hobbie.h_id, profile.p_hobbies) > 0)
Но Гордон прав.Это использует паршивый хак для обработки строк.