Проведение предварительного поиска - PullRequest
0 голосов
/ 05 января 2012

У меня есть одно поле в моей базе данных: xfield
Это поле имеет следующий формат для моих сообщений (продуктов) на веб-сайте:

weight|3kg|year|2009|brand|samsung|monitorsize|13"|modem|yes

Теперь я хочу выполнить предварительный поиск.Например, я хочу искать размеры монитора между 13 "~ 15"
и весом от 1,5 кг до 3,5 кг

Как мне сделать эту страницу поиска с помощью php?

1 Ответ

1 голос
/ 05 января 2012

Вы используете данные 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...