Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поисковый запрос, Запрос по нескольким ячейкам поля 
:(
    Опции темы
pygl
Дата 5.12.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.10.2009

Репутация: нет
Всего: нет



Здравствуйте Уважаемые! Нужен Ваш совет.

Итак, в БД имеется 3 поля

marka - char
price - char
year - int


Некоторые особенности: поля price и year представлены 2 формами каждая, тоесть в первое поле ГОД вводится значение С, а во второе ДО, тоесть диапазон с (такого то) по (такое то), тоже самое с price, но это не суть, просто ввел в курс чтоб легче понимался код

Нужно составить поисковые запросы, вот например:

Код


if (isset($_POST['search']))
{
$marka = trim($_POST['marka']);
$year1 = $_POST['year1'];
$year2 = $_POST['year2'];
$price1 = $_POST['price1'];
$price2 = $_POST['price2'];

$year_query = ""; $price_query = "";

$q = "select * from info where marka like \"%$marka%\"";

// если пользователь изменял диапазон года, значит год его интересует
if ($year1!==$year2) $year_query = "(year>=$year1) and (year<=$year2)";

// если цена ДО не равна 0, значит пользователь изменил цену
if ($price2>0) $price_query = "(price>=$price1) and (price<=$price2)";

// если пользователь не изменял ни цену, ни год выпуска
if ( ($year_query==="") && ($price_query===""))
$q = "select * from info where marka like \"%$marka%\""; // только марка

// если пользователь изменил И цену И год выпуска
if ( ($year_query!=="") && ($price_query!==""))
$q = "select * from info where (marka like \"%$marka%\") AND $year_query AND $price_query"; // марка, цена, год

elseif ( $year_query!=="") $q = "select * from info where (marka like \"%$marka%\") AND $year_query"; // марка + год

elseif ( $price_query!=="") $q = "select * from info where (marka like \"%$marka%\") AND $price_query"; // марка + цена

}


_____________________

все работает, проблем нет, но нужно добавить еще одно поле
type - char, оно полностью идентично marka - char 
но что то у меня ошибки получаются, или пхп кода становится слишком много. Пожалуйста, подскажите правильное решение smile 
PM MAIL   Вверх
Akina
Дата 5.12.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
pygl
Дата 5.12.2009, 00:56 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.10.2009

Репутация: нет
Всего: нет



 smile 
PM MAIL   Вверх
pygl
Дата 5.12.2009, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.10.2009

Репутация: нет
Всего: нет



Akina, В общем как поругали сразу сделал smile , но я просто хотел с упором на sql, а у меня получилась дополнительная куча if-ов, я просто хотел этого избежать...
PM MAIL   Вверх
Akina
Дата 6.12.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



pygl, ну так давай сюда show create table и получившийся запрос. Посмотрим, можно ли его упростить.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 7.12.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(pygl @  5.12.2009,  01:18 Найти цитируемый пост)
а у меня получилась дополнительная куча if-ов

действительно над sql не помешало бы поработать  smile 
имхо все легко заворачивается в один запрос без динамики...
для размыщления:
Код

select * 
  from info i
 where i.marka like '%' || $marka || '%'
   and ((i.price>=$price1 and i.price<=$price2) or ($price1 is null and $price2 is null)) 
   and ((i.year>=$year1 and i.year<=$year2) or ($year1 is null and $year2 is null)) 


вариант конечно не окончательный и зависит от требований к организации поиска, корых от вас пока не поступало.
возможно для мускула проверку "is null" стоит заменить на проверку типа: ($year1 = '' and $year2 ='')
PM MAIL ICQ   Вверх
Akina
Дата 7.12.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(DimW @  7.12.2009,  10:42 Найти цитируемый пост)
i.price>=$price1 and i.price<=$price2

Откройте для себя WHERE fld BETWEEN low AND high

Цитата(DimW @  7.12.2009,  10:42 Найти цитируемый пост)
возможно для мускула проверку "is null" стоит заменить на проверку типа: ($year1 = '' and $year2 ='') 

Это только в Оракле есть такая "фича".


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 7.12.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Akina @  7.12.2009,  10:01 Найти цитируемый пост)
Откройте для себя

по твоему одно не эквивалентно другому?

Цитата(Akina @  7.12.2009,  10:01 Найти цитируемый пост)
Это только в Оракле есть такая "фича". 

о какой "фиче" речь идет? о проверке параметра на null?
PM MAIL ICQ   Вверх
Akina
Дата 7.12.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(DimW @  7.12.2009,  11:25 Найти цитируемый пост)
по твоему одно не эквивалентно другому?

По смыслу эквивалентно. По исполнению нет.

Цитата(DimW @  7.12.2009,  11:25 Найти цитируемый пост)
о какой "фиче" речь идет?

О том, что Null и Empty String есть одно и то же. Во всех (во всяком случае я не знаю исключений) остальных СУБД это не так.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 7.12.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Akina @  7.12.2009,  12:01 Найти цитируемый пост)
По смыслу эквивалентно. По исполнению нет.

ну и какой вывод из этого, я для себя должет сделать?

Цитата(Akina @  7.12.2009,  12:01 Найти цитируемый пост)
О том, что Null и Empty String есть одно и то же. Во всех (во всяком случае я не знаю исключений) остальных СУБД это не так. 

по моему мы это выясняли как минимум в двух темах, всем как бы и так все понятно, собственно именно поэтому я сделал поправку к своему варианту:
Цитата(DimW @  7.12.2009,  09:42 Найти цитируемый пост)
заменить на проверку типа: ($year1 = '' and $year2 ='') 

что касается $price2, судя из примера ТС:
Цитата(pygl @  5.12.2009,  00:06 Найти цитируемый пост)
if ($price2>0)

то все ровно...

собственно о чем речь ведем, как нужно или как можно?

PM MAIL ICQ   Вверх
Akina
Дата 7.12.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(DimW @  7.12.2009,  13:54 Найти цитируемый пост)
собственно о чем речь ведем, как нужно или как можно?

Да мне, признаться, всё равно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.