Запрос Mysql для получения записей из полей с типом данных varchar для хранения идентификатора элемента

Я работаю над модификациями некоторой существующей системы, которая довольно старая.

У меня 3 таблицы. tbl_category → id(int),name(varchar),items(varchar), tbl_items->id(int),name(varchar), tbl_groups → id(int),items(varchar).

В таблице tbl_category я сохраняю некоторый id из tbl_items в items field. То же самое и для tbl_groups. Поэтому теперь мне нужно найти только те категории из tbl_category которых есть элементы, которые присутствуют в tbl_group items.

Это означает, что tbl_category имеет 2 строки с id='1', items = '1,4,5' и id='2',items='4,2,3'

И скажу, что я выбрал строку из tbl_group с id='6' and items='7,2,3' Таким образом, результат будет id='2', items='4,2,3' как только 2-я строка имеет эти item id.

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

Trial and Errors: Я попытался: Взрыть элементы из tbl_group. Цикл через массив. И установка условия, как показано ниже:

$sql .= " AND (items like '%,".$items[$k]."' or items like '".$items[$k].",%' or items like '%,".$items[$k].",%' or TRIM(items) like '".$items[$k]."' ) ";

Это работает, но я хочу что-то немного лучше, чем это, потому что, если элементы в tbl_group больше, чем меня беспокоит цикл, а также накладные расходы. Pls может предложить мне что-то PLS.

1 ответ

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

FIND_IN_SET(id, items)

licensed under cc by-sa 3.0 with attribution.