[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: фильтр данных бд
Страницы: 1, 2
Sergeiqwe93
имеется бд. скрин нужной части ниже.
на сервер приходит массив

$a=$_REQUEST['sR'];

где $a[0] - это id подкатегории, все остальные элементы массива это ограничения (в виде ид элемента)
вот как отфильтровать данные по нужным нам ограничениям(элементом) и выбранной подкатегории. у меня нету пока никаких вариантов. Буду благодарен за любой совет или помощь.
внизу запрос, который фильтрует у меня данные по выбранной подкатегории:

$query = " SELECT Street.name, Adres.house, Organization.sh_name, Adres.gpsx, Adres.gpsy
FROM Adres, Organization, Street, Organ_Adres
WHERE Organ_Adres.id_organ = Organization.Id
AND Adres.Id = Organ_Adres.id_adres
AND Street.Id = Adres.id_street
AND Organization.id_subcat = "
.$a[0]." ";

структура бд ниже скачать файл bd.png
Sergeiqwe93
может быть, я что то плохо описал, или требуются еще какие-то куски кода, могу добавить
inpost
1)
AND Organization.id_subcat = ".$a[0]." ";
Но в таблице Organization нет колонки id_subcat .

2) Что за подкатегория? Я не вижу таблицы subcat


Очень тяжело разобраться. Гораздо проще было бы простым языком, вот города, вот страны, вот у меня есть такой параметр как "город = Украина" и хочу выбрать то и то.
П.С. Это лично мне.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Valick
Цитата
Organization.id_subcat

я не вижу id_subcat ни в таблице Organization, ни в какой либо другой, это как так?
Сам запрос конечно "не фонтан".

_____________
Стимулятор ~yoomoney - 41001303250491
Sergeiqwe93
Цитата (Sergeiqwe93 @ 3.04.2014 - 17:13)
имеется бд. скрин нужной части ниже.
на сервер приходит массив

$a=$_REQUEST['sR'];

где $a[0] - это id подкатегории, все остальные элементы массива это ограничения (в виде ид элемента)
вот как отфильтровать данные по нужным нам ограничениям(элементом) и выбранной подкатегории. у меня нету пока никаких вариантов. Буду благодарен за любой совет или помощь.
внизу запрос, который фильтрует у меня данные по выбранной подкатегории:

$query = " SELECT Street.name, Adres.house, Organization.sh_name, Adres.gpsx, Adres.gpsy
FROM Adres, Organization, Street, Organ_Adres
WHERE Organ_Adres.id_organ = Organization.Id
AND Adres.Id = Organ_Adres.id_adres
AND Street.Id = Adres.id_street
AND Organization.id_subcat = "
.$a[0]." ";

структура бд ниже скачать файл bd.png

исправил
Sergeiqwe93
пытался как-то так:

if (isset($_REQUEST['sR'])){
$a=$_REQUEST['sR'];
for($i==0; $i<count($a); $i++){
if($i==0){
$query = " SELECT Street.name, Adres.house, Organization.sh_name, Adres.gpsx, Adres.gpsy
FROM Adres, Organization, Street, Organ_Adres, No_barrier
WHERE Organ_Adres.id_organ = Organization.Id
AND Adres.Id = Organ_Adres.id_adres
AND Street.Id = Adres.id_street
AND No_barrier.value = 1
AND Organization.id_subcat = "
.$a[0]." ";
}

else{
$query =$query."AND No_barrier.id_elem = ".$a[$i]." ";
}
}
}
Sergeiqwe93
здесь не полная структура бд. вставил только то что нужно для запроса.
попробую объяснить. есть категории организаций, они разделяются на подкатегории.
Также есть категории елементов(ограничений). В таблице элементы хранятся данные, к примеру, лестница, пандусы и т.д.
есть таблица nobarrer c помощью ее я связываю таблицы адрес и елемент(так как связь многи ко многим) поле value, ознаечает галичие, то есть 1-есть, 0-нет
если мне нужно отфильтровать данные для выбранной подкатегории - это не проблема, простой запрос, он у меня написан.
как мне написать расширенный фильтр с учетом выбранных ограничений?
Sergeiqwe93
наверное ни очень получилось на словах
Sergeiqwe93
подскажите пожалуйста, что хоть почитать. пример может быть какой-то... вот запросы я писал часто, но с такой ситуацией не сталкивался. Кажется все просто, но есть сложность...
моим запросом я достаю все организации, адреса орг. и т.д.
организация может находится сразу по нескольким адресам, и по одному адресу может находится неск. орг. по этому возникла потребность в таблице Organ_Adres
для каждой такой связки есть n количество элементов, которые либо есть либо нет. Элементов, например, перила, лестницы, подъемники и т.д. всего их сейчас в бд 24 различных, имеющих свой уникальный идентификатор. Тоесть в таблице No_barrier будет 24 записи к каждой связке адрес_орган(ид_адрес_орган), имеющих значение 1 или 0. На вопрос зачем записи с 0? Заполнением бд, занимался не я. мне кажется было бы лучше только с 1 хранить. нужен запрос, который вернет мне name(организации).
имеется массив
$a, где a[0]-это ид подкатегории(можно даже взять категории, это не важно, вопрос в другом), остальные id елемента
помогите хоть чем. совет, если он не касается изменения структуры бд и данных - хорошо, пример - еще лучше. возможно все окажется просто, вот я просто кастыль писать не хочу с кучами запросов. помогите)
inpost
какой фильтр, что надо получить.
Распиши конкретно ВХОДЯЩИЕ данные и ИСХОДЯЩИЕ. Придумаем тебе.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Sergeiqwe93
входящие данные - Organization.id_subcat (можно id_cat_org), No_barrier.id_elem(их может быть несколько)
на выходе - например, Organization.name
Sergeiqwe93
Ребята, ну помогите хоть чем... Вообще не знаю как подойти. то ли кучу селектов писать, то ли еще что-нибудь.
inpost
Согласно т/з:
входящие данные - Organization.id_subcat (можно id_cat_org), No_barrier.id_elem(их может быть несколько)
на выходе - Organization.name


SELECT a.`organization_name`
FROM `organization` a
LEFT JOIN `organ_adres` b ON `a`.`id` = b.`id_organ`
LEFT JOIN `Adres` c ON c.`id` = b.`id_adres`
LEFT JOIN `No_barrier` d ON d.`id_organ_adres` = b.`id_adres`
WHERE d.`id_elem` IN (".implode(',',$_GET['id_element']).")
OR d.`id` = ".(int)$_GET['id_barrier']."
OR b.`id_subcat` = ".(int)$_GET['id_subcat']."


Должно работать.
Дальше лишнее из WHERE убери, то есть в зависимости от входящих данных подставлять будешь нужное. Если данные будут дублироваться, то можно порезать очень просто через GROUP BY a.`id` или a.`organization_name` , или LIMIT 1.

_________________________________

На своей практике замечал, что несколько select во вложенности работают быстрее, чем LEFT JOIN, RIGHT JOIN. Поэтому не бойся строить лесенку, лучше 3 небольших запроса, чем 1 запрос столь сложный для БД, как я выше изобразил. Зато запрос сразу всё за тебя сделает.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Sergeiqwe93
спасибо большое) пока не проверял, проверю-отпишу
Sergeiqwe93
inpost, еще раз спасибо большое)
вот что получилось:
SELECT a.`sh_name`
FROM `Organization` a
LEFT JOIN `Organ_Adres` b ON `a`.`id` = b.`id_organ`
LEFT JOIN `Adres` c ON c.`id` = b.`id_adres`
LEFT JOIN `No_barrier` d ON d.`id_organ_adres` = b.`id`
WHERE d.`id_elem` IN (1,2,3)
and a.`id_subcat` = 1
and d.value =1 ORDER BY `a`.`sh_name` DESC

здесь
WHERE d.`id_elem` IN (1,2,3)

Оператор IN определяет набор значений в которое данное значение может или не может быть включено. А есть какой-нибудь оператор, который определяет набор значений должно быть обязательно вкл
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.