Forum Webscript.Ru
		Программирование => Perl => Тема начата: Duke от 24 Ноября 2002, 04:50:25
		
			
			- 
				Тут приспичило написать скриптик который вынимал бы из mysql таблицы только те 
 строки которые удовлетворяли бы параметрам запроса по нескольким параметрам этой строки.
 Т.е. таблица 15 колонок - параметры радиоэлементов. Пользователь задает из 15
 только 3 (например) - диапазон емкостей, пробивное U и массу искомого
 кондёра, и скрипт выдает ему строки из бызы удовлетворяющие его запросу.
 
 Можно сформулировать вопрос так:
 Как дать "понять" базе, что если какой-либо параметр не задан, то выбирать информацию из таблицы игнорирую его, но не игнорируя заданные?
- 
				Это же очевидно. Проверить какие параметры заданныы и уже усновываясь на этом строить запрос
			
- 
				if($param5){$sql.="and param5>$param5";}
			
- 
				2AlieN, спасибо помогло. Встала другая задача.
 
 if($param1){$sql.="param1>$param1";}
 if($param2){$sql.="and param2>$param2";}
 if($param3){$sql.="and param3>$param3";}
 if($param4){$sql.="and param4>$param4";}
 if($param5){$sql.="and param5>$param5";}
 
 в результате если выбирут 2 и 4 параметры то получиться
 
 $sql = "and param2>$param2 and param4>$param4"
 
 а такой запрос MySQL обрабатывать отказывается
 Как убрать "and" в начале строки "and param2>$param2 and param4>$param4"
- 
				if ($param1) {
 if ($sql) {$sql.=" AND ";}
 $sql.=\' param1>$param1";
 }
 
 ну и так далее.
 
 
 ЗЫ
 Вообще эту тему нужно в perl перенести.
- 
				sdelai tak :
 $sql.=" 1=1 ";
 if($param1){$sql.="param1>$param1";}
 if($param2){$sql.="and param2>$param2";}
 if($param3){$sql.="and param3>$param3";}
 if($param4){$sql.="and param4>$param4";}
 if($param5){$sql.="and param5>$param5";}
 
 tak chtoby u tebia poluchilos\' takaia k primeru sql query:
 
 "SELECT * FROMWHERE 1=1 and param2>$param2 and param4>$param4"
 
 Vot tak prosto ;)
 
- 
				Stas, а про циклы ничего не слышал?
 Ну а про то, что на БД не стоит возлагать лишнюю работу, я тебе уже написал в другом форуме.
 
 my @array;
 for (1..5) {push @array,"param1>$param[$_]" if $param[$_];}
 $sql.=join(" AND ",@array);
- 
				stop.. ia tut ne pisal naskol\'ko krasiv kod kotoryi napisan vyshe.. I ne pisal kak mozhno ego izmenit\' v luchshuiu storonu...
 
 Ne znaiu kak ty ne zametil, chto ia ot sebia dobavil vsego 1 liniu :
 $sql.=" 1=1 ";
 
 a kod nizhe protsitiroval Duke...
 
 Malo, togo, tebe zdravyi smysl ne podskazyvaet, chto esli ia
 про циклы ничего не слышал? to ia by navernoe dazhe etot forum ne nashel !! ;)
- 
				Сделал самый простой вариант с "заглушкой" - $sql.=" 1=1 ";
 Работает.
 С массивами и вариантом Макса разбирусь позже.
- 
				Следующая задача.
 
 в базе есть колонка зачения в которой буквенно-цифровые (varchar - или другой тип надо?). Сами значения такие M75, M750, H90 и т.д.
 
 на запрос "SELECT * FROM condenser1 WHERE tke_grup=M75", база вообще не отвечает. Буквы и там, и там на английском (с русским боязно связываться, буду сначала говорить с MySQL на её родном языке :)).
- 
				Duke 
 кавычки поставьtke_grup=\'M75\'