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

Форум MySQL

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

 

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

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

тема: Объединение таблиц для поиска по сайту
 
 автор: Aramor   (15.04.2009 в 10:39)   письмо автору
32.3 Кб
 
 

Занимаюсь реализацией поиска на сайте.
На сайте есть справочник по фирмам города. Фирма может иметь прайс-лист, также у фирм есть рейтинг, который получается разностью положительный и отрицательных отзывов. Фирма состоит в подкатегориях, который в свою очередь состоят в категориях. Нарпимер категория "Сухопутный транспорт" может включать в себя подкатегории "мотоциклы", "легковые автомобили" и т.д. Подкатегория может быть включена либо в товары либо в услуги, это ещё одна связь подкатегорий. Связь всех таблиц я постарался изобразить на рисунке.

Долго думал над тем, как осущиствить поиск, но не придумал ничего лучше этой схемы:
Т.к. у фирм куча пораметров (адрес, телефон, е-маил, доаолнительный адрес, краткое описание и т.д.), решил создать таблицу, в одно поле которой собрать весь перечень возможных запросов по фирме. Это таблица "index".
Допустим пользователь ввёл "транспорт". Тогда должны вывестись все фирмы, которые состоят в подкакатегории, принадлежащей категории, в названии или описании которой есть слово "транспорт". Если же фирма находится на улице Транспортной, то эта фирма тоже должна вывестись. Причём вывод должен иметь следующий вид:
| Категория | Фирма | Рейтинг фирмы |
Естественно, фирма, находящаяся на улице Транспортной, может состоять в нескольких категориях, тогда в графе "категория" нужно вывести все эти категории через запятую.
Ну и самое интересное, при выводе должно учитываться в первую очередь наличие прайса, во вторую рейтинг. То есть сначала выводятся все фирмы с прайсами, между совой они выстраиваются в зависимости от рейтинга, потом идут фирмы бес прайса и тоже идут в зависимости от рейтинга. Прайсов у фирмы может быть несколько, выбирается последний. В каталоге есть ещё частные бригады, поэтому где есть prenadl, он лдолжен быть равен 'f' для фирм, 'b' для бригад.

Таблицы:
CREATE TABLE `firms` (
  `id` int(25) NOT NULL auto_increment,
  `name` varchar(100) default NULL,

  ***
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=225 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=225 ;

CREATE TABLE `index` (
  `idindex` int(255) NOT NULL auto_increment,
  `firmbrid` int(255) NOT NULL,
  `prenadl` varchar(2) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY  (`idindex`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

CREATE TABLE `resp` (
  `id` int(10) NOT NULL auto_increment,
  `znach` int(1) NOT NULL,
  `comment` text,
  `firm_br_id` int(255) NOT NULL,
  `prenadl` varchar(2) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=177 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=177 ;

CREATE TABLE `temp_price` (
  `id` int(255) NOT NULL auto_increment,
  `filename` varchar(255) NOT NULL,
  `firm_id` int(255) NOT NULL,
  `time` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=6 ;

CREATE TABLE `podcat_firms` (
  `id` int(255) NOT NULL auto_increment,
  `podcat_id` int(255) NOT NULL,
  `firms_id` int(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=160 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=160 ;

CREATE TABLE `podcat` (
  `id` int(255) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `ind` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=149 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=149 ;

CREATE TABLE `cat_podcat` (
  `id` int(11) NOT NULL auto_increment,
  `cat_id` int(11) NOT NULL,
  `podcat_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=173 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=173 ;

CREATE TABLE `cat` (
  `id` int(255) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=53 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=53 ;

CREATE TABLE `podcat_glava` (
  `id` int(255) NOT NULL auto_increment,
  `podcat_id` int(10) NOT NULL,
  `glava_id` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=360 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=360 ;

CREATE TABLE `glava` (
  `id` int(255) NOT NULL auto_increment,
  `name` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;


Для просто вывода в каталоге используется следующий запрос, написаный не мной, может пригодятся:

SELECT DISTINCT firms_temp.* FROM (SELECT f.*, (prt IS NOT NULL) AS ppl, COALESCE(rat,0) AS rats
FROM firms AS f 
LEFT JOIN (SELECT firm_id, MAX(time) as prt FROM temp_price GROUP BY firm_id) AS pl  
ON f.id = pl.firm_id  
LEFT JOIN (SELECT firm_br_id, SUM(znach*2-3) AS rat FROM resp WHERE `prenadl` = 'f' GROUP BY firm_br_id) AS rt 
ON f.id = rt.firm_br_id  
ORDER BY ppl DESC, rats DESC, name ) AS firms_temp, podcat_firms, cat_podcat, podcat_glava 
WHERE firms_temp.id=podcat_firms.firms_id 
AND podcat_firms.podcat_id=cat_podcat.podcat_id
AND cat_podcat.cat_id=$cat_id
AND cat_podcat.podcat_id=podcat_glava.podcat_id
AND podcat_glava.glava_id=$n
ORDER BY firms_temp.ppl DESC, firms_temp.rats DESC, firms_temp.name

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

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