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

Форум MySQL

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

 

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

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

тема: Сложный запрос к поисковой системе!
 
 автор: m2be   (07.09.2009 в 16:47)   письмо автору
 
 

Всем доброго времени суток!
В общем уже неделю не могу написать правильный запрос на динамическое формирование списка поисковых атрибутов в зависимости от выбранных ранее атрибутов.
Есть 4 таблицы.
filtr - содержит информацию о турбазе.

CREATE TABLE `13_filtr` (
  `id` int(100) NOT NULL default '0',
  `active` int(1) NOT NULL default '0',
  `img` varchar(100) NOT NULL default '',
  `title` varchar(255) NOT NULL default '',
  `pretext` text NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

filtr_cols - содержит список типов поисковых атрибутов

CREATE TABLE `13_filtr_cols` (
  `id` int(11) NOT NULL default '0',
  `title` varchar(255) NOT NULL default '',
  `type` varchar(40) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

filtr_types - содержит значения поисковых атрибутов(поле pid содержит значение типа поискового атрибута из таблицы filtr_cols)
 
CREATE TABLE `13_filtr_types` (
  `id` int(11) NOT NULL default '0',
  `pid` int(11) NOT NULL default '0',
  `title` varchar(255) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

и наконец filtr_z - таблица, связывающая все предыдущие.

CREATE TABLE `13_filtr_z` (
  `filtr_id` int(99) NOT NULL default '0',
  `col_id` int(99) NOT NULL default '0',
  `type_id` int(99) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Допустим, типами поисковых атрибутов будут Направление и Услуги
Задача: получить список всех услуг, который предоставляются базами в выбранном направлении.

Помогите, пожалуйста!

Делаю что-то вроде этого, к примеру (ничего не получается)

SELECT z.* 
FROM 
13_filtr_z 
AS z WHERE z.col_id = 2
INNER JOIN 
13_filtr_types AS t
ON z.type_id = t.id AND t.id = 24 OR z.col_id = 3
GROUP BY z.type_id

  Ответить  
 
 автор: heed   (07.09.2009 в 19:06)   письмо автору
 
   для: m2be   (07.09.2009 в 16:47)
 

не очень понял то что спрашивается

>Допустим, типами поисковых атрибутов будут Направление и Услуги
> который предоставляются базами в выбранном направлении.

непонятно причём вобще базы

выборку вроде пробовали делать тоже заиспользовав всего две таблицы,
только примерно так делается по синтаксису,
и что-то ON z.type_id = t.id AND t.id = 24 OR z.col_id = 3
я понял примерно так
SELECT z.* FROM
`13_filtr_z` AS z
LEFT JOIN
`13_filtr_types` AS t
ON z.type_id = t.id = 24
WHERE z.col_id = 2 OR z.col_id = 3
GROUP BY z.type_id;

т.е. z.type_id = t.id = 24 тогда вообще получается что вторая таблица не нужна

(z.type_id = t.id AND t.id = 24) OR z.col_id = 3 так понимаются эти скобки если их нет

  Ответить  
 
 автор: m2be   (07.09.2009 в 21:21)   письмо автору
 
   для: heed   (07.09.2009 в 19:06)
 

Это наверное я плохо изъясняюсь )))
Дело обстоит так, под база - я понимаю турбаза.
Есть список турбаз. У нее есть поисковые атрибуты, такие как Направление, Услуги, Специализация и т.д.
В свою очередь поисковые атрибуты делятся на виды (к примеру "Специализация" - лечение, активный отдых, корпоративный отдых и т.д.)
При выборе в поисковой форме конкретного атрибута, остальные должны формироваться исходя из предыдущего выбора.
Причем должна быть возможность добавлять новые поисковые атрибуты и их списки без создания новых таблиц в базе данных.

Возможно даже, что у меня не правильно организована структура базы данных (
Прошу мне помочь в этом.

  Ответить  
 
 автор: heed (..)   (07.09.2009 в 22:25)
 
   для: m2be   (07.09.2009 в 21:21)
 

>наверное я плохо изъясняюсь
уж точно скорее Вы , чем я :)

я к тому спрашивал , что наверное данные.то в основном из первой таблицы выводить надо , или именно только цифры и названия из таблицы подразделов выбранного раздела ?
Причём, как мне кажется ,
(если что , взрослые поправят ,))
нельзя сделать так чтобы одним запросом получить в одной строке строку из одной таблицы , и несколько названий сразу из другой , если только не писать ещё и хранимые функции, что ничем не лучше ещё запросов к каждому ряду полученного результата.

А насчёт запоминания выбранного это ещё таблица пользователей , или сессии или cookies или get.параметры

  Ответить  
 
 автор: heed   (07.09.2009 в 23:37)   письмо автору
 
   для: heed (..)   (07.09.2009 в 22:25)
 

> и несколько названий сразу
ошибся , можно, GROUP_CONCAT()

//насчёт структуры , маловато индексов

  Ответить  
 
 автор: heed (..)   (07.09.2009 в 22:32)
 
   для: m2be   (07.09.2009 в 21:21)
 

Это я имелввиду какие значения , точнее какие поля и из каких таблиц получить.то нужно ?

  Ответить  
 
 автор: heed   (08.09.2009 в 11:40)   письмо автору
 
   для: m2be   (07.09.2009 в 21:21)
 

Что-то у меня получилось сделать только с подзапросом
, если так примерно набросать то что можно выбирать
SELECT b.id, b.title, c.title, GROUP_CONCAT(t.title) FROM
    `13_filtr_z` z
LEFT JOIN
    `13_filtr_cols` c
 ON c.id=z.col_id
LEFT JOIN
  `13_filtr_types` t
 ON t.id=z.type_id
LEFT JOIN
    `13_filtr` b
 ON b.id=z.filtr_id
WHERE t.pid=2 AND EXISTS (SELECT * FROM `13_filtr_z`
             WHERE filtr_id=b.id AND col_id=1 AND type_id=t.pid)
GROUP BY b.id;
здесь 1 это идентификатор группы "направлениия"
2 это нужное направление

  Ответить  
 
 автор: m2be   (11.09.2009 в 13:51)   письмо автору
 
   для: heed   (08.09.2009 в 11:40)
 

Огромное спасибо!!!!!! Разобрался )

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

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