Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: фильтрация товара
 
 автор: Лена   (17.06.2010 в 14:18)   письмо автору
 
 

Первая таблица - характеристика товара

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'];

}


Вопросы такие: правильная ли структура базы и правильно ли я делаю выборку?
у меня есть еще вариант создать общую таблицу категорий - где перечислены все группы характеристик.

  Ответить  
 
 автор: sms-send   (17.06.2010 в 14:27)   письмо автору
 
   для: Лена   (17.06.2010 в 14:18)
 

Одному товару может соответствовать одна характеристика?

  Ответить  
 
 автор: Лена   (17.06.2010 в 14:38)   письмо автору
 
   для: sms-send   (17.06.2010 в 14:27)
 

Смотрите.
Есть у нас товар. У товара есть функция фильтрации. Эта функция находится в таблице functions, под id=1. У другого товара, напр., есть функция - ионизация, у третьего еще что-то. Т.е. у любого товара м.б. только одна функция.
Так же точно и с другими характеристиками.
Есть Тип внутреннего блока - настенный, канальный и т.д. - у товара м.б. только одна из этих характеристик.
Есть вроде как группа характеристик и товар из этой группы может обладать только одной характеристикой.

  Ответить  
 
 автор: sms-send   (17.06.2010 в 15:04)   письмо автору
 
   для: Лена   (17.06.2010 в 14:38)
 

> Т.е. у любого товара м.б. только одна функция.

http://hotline.ua/tx/daikin_ftxr50erxr50e

Основные функции
Охлаждение да
Обогрев да
Фильтрация да


Точно только одна?

  Ответить  
 
 автор: Axxil   (17.06.2010 в 15:14)   письмо автору
 
   для: Лена   (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;


расширять характеристики будет гораздо проще и вообще гибкость повысится.

  Ответить  
 
 автор: Лена   (17.06.2010 в 15:41)   письмо автору
1.8 Кб
 
   для: Axxil   (17.06.2010 в 15:14)
 

Я и вам, и sms-send в одном ответе отвечу :)

Наверное, стоит рассказать, что у меня было с самого начала.
Мне дали 1 таблицу, она - в аттаче. В эту таблицу свалили все по товару - и название, и характеристики, и цену и т.д.
Я решила цену, гарантию, тип компрессора, режим работы оставить в таблице товаров, все остальные характеристики разбить по группам и вынести в отдельную таблицу.

Ниже таблицы(там же, в аттаче) - список фильтров, который должен быть на странице. Мне не совсем понятно, как эти ссылки на странице формировать, чтобы в адресной строке было как на http://hotline.ua/gd/72/7216-7217-1016/

Если делать, как вы предложили, получается мне в таблице product_properties надо еще одно поле для родителя сделать. Напр. характеристика Функции - родитель, фильтрация, ионизация и т.д. - его потомки.

  Ответить  
 
 автор: Axxil   (17.06.2010 в 16:43)   письмо автору
 
   для: Лена   (17.06.2010 в 15:41)
 

Ну да, если нужно группировать характеристики, то

1. можно сделать таблицу product_properties_groups (если точно известно, что группы характеристик будут иметь максимум один уровень вложенности) и связать её с product_properties полем group_id,

2. либо в самой таблице product_properties добавить поле parent_id и тогда можно туда заносить дерево характеристик любого уровня вложенности.

  Ответить  
 
 автор: Лена   (20.06.2010 в 16:23)   письмо автору
 
   для: 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


Но. Если таких характеристик будет много, тогда и вложенных запросов будет много. что не очень удобно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования