ГДЕ-В или FIND_IN_SET

Ненормализованная БД имеет таблицу с именем пакетов

В пакетах таблиц есть поле student_ids с несколькими идентификаторами. Например 1311, 1319, 1400

Из: ВЫБЕРИТЕ student_ids ИЗ пакетов, ГДЕ 1311 IN (student_ids)

мы получаем student_ids: 1311, 1319, 1400

И: ВЫБЕРИТЕ student_ids ИЗ пакетов, ГДЕ 1319 В (1311, 1319, 1400)

отлично работает: 1311, 1319, 1400

но

ВЫБЕРИТЕ идентификаторы_студентов ИЗ пакетов, ГДЕ 1319 В (идентификаторы_студентов)

or

ВЫБЕРИТЕ @student_ids := student_ids FROM пакетов b; ВЫБЕРИТЕ идентификаторы учащихся ИЗ пакетов, ГДЕ НАЙТИ_IN_SET (1319, @student_ids)

возвращает Null

Что мне не хватает? Я думаю, что мне нужно преобразовать первый результат в массив, но как?

Я попробовал предложения Даша (большое спасибо, Даш), но у меня все еще есть проблемы

Я также пробовал SELECT id FROM пакетов WHERE INSTR(','+1319+',', ','+CAST(student_ids AS CHAR) + ',')

как предложил Мэтт Эллен в другом сообщении - снова работает, только если первый элемент соответствует


person apwatts    schedule 08.08.2012    source источник


Ответы (1)


попробуй это:

SELECT @student_ids := GROUP_CONCAT(CAST(TRIM(student_ids) AS UNSIGNED INTEGER)) 
FROM batches b; 

SELECT student_ids 
FROM batches 
WHERE FIND_IN_SET(1311, @student_ids) ;

or

SELECT student_ids FROM batches WHERE CAST(student_ids AS UNSIGNED INTEGER) IN (1319);
person Omesh    schedule 08.08.2012
comment
Вау, спасибо за мгновенный ответ. К сожалению, это работает только для первого идентификатора 1311 — если вы попробуете 1319, вы получите нуль. - person apwatts; 08.08.2012
comment
попробуйте новый запрос. это должно быть похоже на student_ids IN (1319) попробуйте использовать обрезку. - person Omesh; 08.08.2012
comment
Еще не совсем так: поле student_ids имеет тип varchar, имеет данные «1311,1319,1400», но функция IN не может видеть дальше первого элемента. - person apwatts; 08.08.2012
comment
в этом случае вам может понадобиться cast это, чтобы integer или TRIM это. - person Omesh; 08.08.2012