|
|
|
| Всем доброго времени суток!
В общем уже неделю не могу написать правильный запрос на динамическое формирование списка поисковых атрибутов в зависимости от выбранных ранее атрибутов.
Есть 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
|
| |
|
|
|
|
|
|
|
для: 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 так понимаются эти скобки если их нет | |
|
|
|
|
|
|
|
для: heed
(07.09.2009 в 19:06)
| | Это наверное я плохо изъясняюсь )))
Дело обстоит так, под база - я понимаю турбаза.
Есть список турбаз. У нее есть поисковые атрибуты, такие как Направление, Услуги, Специализация и т.д.
В свою очередь поисковые атрибуты делятся на виды (к примеру "Специализация" - лечение, активный отдых, корпоративный отдых и т.д.)
При выборе в поисковой форме конкретного атрибута, остальные должны формироваться исходя из предыдущего выбора.
Причем должна быть возможность добавлять новые поисковые атрибуты и их списки без создания новых таблиц в базе данных.
Возможно даже, что у меня не правильно организована структура базы данных (
Прошу мне помочь в этом. | |
|
|
|
|
автор: heed (..) (07.09.2009 в 22:25) |
|
|
для: m2be
(07.09.2009 в 21:21)
| | >наверное я плохо изъясняюсь
уж точно скорее Вы , чем я :)
я к тому спрашивал , что наверное данные.то в основном из первой таблицы выводить надо , или именно только цифры и названия из таблицы подразделов выбранного раздела ?
Причём, как мне кажется ,
(если что , взрослые поправят ,))
нельзя сделать так чтобы одним запросом получить в одной строке строку из одной таблицы , и несколько названий сразу из другой , если только не писать ещё и хранимые функции, что ничем не лучше ещё запросов к каждому ряду полученного результата.
А насчёт запоминания выбранного это ещё таблица пользователей , или сессии или cookies или get.параметры | |
|
|
|
|
|
|
|
для: heed (..)
(07.09.2009 в 22:25)
| | > и несколько названий сразу
ошибся , можно, GROUP_CONCAT()
//насчёт структуры , маловато индексов | |
|
|
|
|
автор: heed (..) (07.09.2009 в 22:32) |
|
|
для: m2be
(07.09.2009 в 21:21)
| | Это я имелввиду какие значения , точнее какие поля и из каких таблиц получить.то нужно ? | |
|
|
|
|
|
|
|
для: 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 это нужное направление | |
|
|
|
|
|
|
|
для: heed
(08.09.2009 в 11:40)
| | Огромное спасибо!!!!!! Разобрался ) | |
|
|
|