Вы используете данные CSV в базе данных, это действительно очень плохая идея, которая сделает вас смелым (вставьте сюда случайную фотографию человека, который вырывает волосы).
Никогда не используйте CSV в базах данных, этоpattern.
Вместо этого вам нужно реорганизовать дизайн вашей БД, чтобы поместить только одно значение в одно поле.
Я предполагаю, что вы хотите быть максимально гибким.
В этомслучай использования entity-attribute-value
модель (EAV).
Ваша таблица должна выглядеть следующим образом:
table properties (
id unsigned integer auto_increment primary key,
product_id unsigned integer,
attribute varchar(20) not null,
astring varchar(100),
anumber decimal(10,2),
atype enum('string','integer','boolean','float'),
unit varchar(10) not null,
foreign key (product_id) references product(id) on update cascade on delete cascade,
foreign key (attribute) references attribute(name) on update cascade on delete cascade,
foreign key (unit) references unit(name) on update cascade on delete cascade
) ENGINE = InnoDB;
table unit (
name varchar(10) primary key -- "kg","inch",.......
) ENGINE = InnoDB;
table attribute (
name varchar(20) primary key -- allowed name for the attribute
) ENGINE = InnoDB;
Ссылки на внешние таблицы гарантируют, что ваши юниты и атрибуты выбраны из ограниченного пула согласованных идентификаторов.
ТеперьВы можете запросить вашу БД, используя что-то вроде этого:
SELECT p.id, p.name
FROM product p
INNER JOIN properties ps1 ON (ps1.product_id = p.id)
INNER JOIN properties ps2 ON (ps2.product_id = p.id)
WHERE ps1.attribute = 'monitorsize' AND ps1.anumber BETWEEN 13 AND 15
WHERE ps2.attribute = 'weight' AND ps2.anumber BETWEEN 1.5 AND 3.5