|
|
|
| Первая таблица - характеристика товара
CREATE TABLE `block_type` (
`id_block` int(11) NOT NULL auto_increment,
`name_block` varchar(255) NOT NULL,
PRIMARY KEY (`id_block`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
INSERT INTO `block_type` VALUES (1, 'настенный');
INSERT INTO `block_type` VALUES (2, 'канальный');
|
Таблица производителей -
CREATE TABLE `manufacturer` (
`id_mnf` int(11) NOT NULL auto_increment,
`name_mnf` varchar(255) NOT NULL,
PRIMARY KEY (`id_mnf`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
INSERT INTO `manufacturer` VALUES (1, 'Mitsubishi Electric');
INSERT INTO `manufacturer` VALUES (2, 'Daikin');
|
Таблица товаров -
CREATE TABLE `product` (
`id` int(11) NOT NULL,
`manufacturer` int(11) default NULL,
`pr_name` varchar(255) NOT NULL,
`block_type` int(11) default NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=100023;
|
product.manufacturer == manufacturer.id_mnf
product.block_type == block_type.id_block
Нужно сделать фильтрацию товаров по разным характеристикам. Аналог - http://hotline.ua/gd/72/7216-7217-1016/, слева фильтры, при нажатии на ссылку фильтра появляются товары.
Например, что-то типа такого...
<?php
//выбираем все товары
$q = "SELECT * FROM product";
//здесь получаем результат запроса
if(isset($_GET)){
$q .= "WHERE";
if($_GET['mnf']){
//выбран производитель
if(count($_GET)>=1){
//выбрано больше одной характеристики, дописываем AND
$q .= "AND";
}
$q .= "manufacture = " . (int)$_GET['mnf'];
}elseif($_GET['block_type']){
//выбрана характеристика block_type
if(count($_GET)>=1){
//выбрано больше одной характеристики, дописываем AND
$q .= "AND";
}
$q .= "block_type = " . (int)$_GET['bt'];
}elseif($_GET['other']){
//выбрана еще одна характеристика
$q .= "other = " . (int)$_GET['other'];
}
|
Вопросы такие: правильная ли структура базы и правильно ли я делаю выборку?
у меня есть еще вариант создать общую таблицу категорий - где перечислены все группы характеристик. | |
|
|
|
|
|
|
|
для: Лена
(17.06.2010 в 14:18)
| | Одному товару может соответствовать одна характеристика? | |
|
|
|
|
|
|
|
для: sms-send
(17.06.2010 в 14:27)
| | Смотрите.
Есть у нас товар. У товара есть функция фильтрации. Эта функция находится в таблице functions, под id=1. У другого товара, напр., есть функция - ионизация, у третьего еще что-то. Т.е. у любого товара м.б. только одна функция.
Так же точно и с другими характеристиками.
Есть Тип внутреннего блока - настенный, канальный и т.д. - у товара м.б. только одна из этих характеристик.
Есть вроде как группа характеристик и товар из этой группы может обладать только одной характеристикой. | |
|
|
|
|
|
|
|
для: Лена
(17.06.2010 в 14:38)
| | > Т.е. у любого товара м.б. только одна функция.
http://hotline.ua/tx/daikin_ftxr50erxr50e
Основные функции
Охлаждение да
Обогрев да
Фильтрация да
Точно только одна? | |
|
|
|
|
|
|
|
для: Лена
(17.06.2010 в 14:18)
| | Лучше сделать таблицу-справочник с характеристиками товаров и таблицу связей товаров с характеристиками.
CREATE TABLE `product_properties` (
`property_id` int(11) NOT NULL,
`property_name` varchar(255) NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `product_properties_links` (
`product_id` int(11) NOT NULL,
`property_id` int(11) NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
расширять характеристики будет гораздо проще и вообще гибкость повысится. | |
|
|
|
|
 1.8 Кб |
|
|
для: Axxil
(17.06.2010 в 15:14)
| | Я и вам, и sms-send в одном ответе отвечу :)
Наверное, стоит рассказать, что у меня было с самого начала.
Мне дали 1 таблицу, она - в аттаче. В эту таблицу свалили все по товару - и название, и характеристики, и цену и т.д.
Я решила цену, гарантию, тип компрессора, режим работы оставить в таблице товаров, все остальные характеристики разбить по группам и вынести в отдельную таблицу.
Ниже таблицы(там же, в аттаче) - список фильтров, который должен быть на странице. Мне не совсем понятно, как эти ссылки на странице формировать, чтобы в адресной строке было как на http://hotline.ua/gd/72/7216-7217-1016/
Если делать, как вы предложили, получается мне в таблице product_properties надо еще одно поле для родителя сделать. Напр. характеристика Функции - родитель, фильтрация, ионизация и т.д. - его потомки. | |
|
|
|
|
|
|
|
для: Лена
(17.06.2010 в 15:41)
| | Ну да, если нужно группировать характеристики, то
1. можно сделать таблицу product_properties_groups (если точно известно, что группы характеристик будут иметь максимум один уровень вложенности) и связать её с product_properties полем group_id,
2. либо в самой таблице product_properties добавить поле parent_id и тогда можно туда заносить дерево характеристик любого уровня вложенности. | |
|
|
|
|
|
|
|
для: Axxil
(17.06.2010 в 16:43)
| | Сделала по второму варианту.
Если у нас выбирается одна характеристика - запрос работает, например:
SELECT p.*, pr.property_name pn, pr.property_pid prpid, pr.property_id pri
FROM product p
LEFT JOIN product_properties_links prl ON p.id = prl.product_id
LEFT JOIN product_properties pr ON pr.property_id = prl.property_id
WHERE prl.property_id = 33
|
Но если у нас две характеристики берутся во внимание - запрос почему-то возвращает пустой результат:
SELECT p.*, pr.property_name pn, pr.property_pid prpid, pr.property_id pri
FROM product p
LEFT JOIN product_properties_links prl ON p.id = prl.product_id
LEFT JOIN product_properties pr ON pr.property_id = prl.property_id
WHERE prl.property_id = 33 AND prl.property_id = 13
|
Т.е. допустим, хочу я выбрать производителя товара(property_id = 33) и среди товаров этого производителя выбрать товар, который обладает характеристикой с property_id = 13
PS Написала, и поняла, в чем дело. Надо с подзапросом, по-моему делать. Что-то вроде такого...
SELECT *
FROM (
SELECT p. * , pr.property_name pn, pr.property_pid prpid, pr.property_id pri
FROM product p
LEFT JOIN product_properties_links prl ON p.id = prl.product_id
LEFT JOIN product_properties pr ON pr.property_id = prl.property_id
WHERE prl.property_id =13
)prod
LEFT JOIN product_properties_links prl ON prod.id = prl.product_id
LEFT JOIN product_properties pr ON pr.property_id = prl.property_id
WHERE pr.property_id =33
|
Но. Если таких характеристик будет много, тогда и вложенных запросов будет много. что не очень удобно. | |
|
|
|