Мне нужно создать sql-запрос для таблицы «продукты». Структура таблицы выглядит следующим образом:
item_no pack_no name model sellingprice discount price_rs quality 101 1001 aa 2001 $500 10% Rs.24750 excellent 102 1002 bb 1996 $400 5% Rs.20900 poor 103 1003 cx 1986 $400 5% Rs.20900 good 104 1004 dx 2010 $500 10% Rs.24750 poor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 5000 bx 1998 $200 10% Rs.9900 very good
и так далее..
У меня есть различные условия, которые заключаются в следующем:
Сказать,
Мне нужно отфильтровать все продукты, чьи
model is between 1990 to 2010 AND sellingprice is between 600 to 700 AND discount is between 0 to 20% AND quality is between good and excellent
Все это в одном выражении SELECT. Возможно ли это, или мне нужно создать различные инструкции, а затем объединить результат?
Его можно сделать в одном запросе select. Вот пример:
select field-1, field-2,.....,field-n from tablename where (field-1 between value-1 and value-2) AND (field-2 between value-3 and value-4) AND (field-3 IN ('value-5', 'value-6',...,'value-n')) ............ AND (field-n ....[CONDITION].......) where [CONDITION]
Вы можете сделать это в одном запросе SELECT и построить его динамически.
Например, предположим, что вы можете иметь «модель» между 1990 и 2010 годами, используя два combobox. По умолчанию для comboboxes указано «any»:
$ands = array(); $betweens = array('model', 'sellingprice', ...); foreach ($betweens as $basekey) { $key1 = $basekey . '_from'; if (!isset($_POST[$key1])) continue; if ('' == ($val1 = $_POST[$key1])) continue; $key2 = $basekey . '_to'; if (!isset($_POST[$key2])) continue; if ('' == ($val2 = $_POST[$key2])) continue; // Check that val1 and val2 have sane values // PDO would be a little different, and slightly more complicated // On the other hand, if NOT using PDO, SQL injection has to be taken into // account. Just in case. if (!is_numeric($val1)) $val1 = "'" . mysql_real_escape_string($val1) . "'"; if (!is_numeric($val2)) $val2 = "'" . mysql_real_escape_string($val2) . "'"; $ands[] = "($basekey BETWEEN $val1 AND $val2)"; }
Теперь у вас есть множество дополнительных, необязательных условий, которые могут быть объединены с AND:
$and_query = implode(' AND ', $ands);
И полученное условие, если оно не пустое, может быть использовано:
$query = "SELECT ... WHERE ( main conditions )"; if (count($ands)) $query .= " AND ( $and_query ) ";
Вы также можете добавить условия, «равные» с полями, отличными от полей, перечисленных в $ betweens.
Да, это возможно.
Select * from table where (model between 1990 and 2010) AND (sellingprice between 600 and 700) AND (discount between 0 and 20) AND (quality IN ('good', 'very good', 'excellent'));
SELECT * FROM products where model >=1990 AND model <= 2010 AND sellingprice >= 600 AND sellingprice <=700 AND discount <= 20 AND (quality ="good" OR quality ="very good" OR quality ="excellent")
возможно только в том случае, если знаки «$» и «%» не хранятся в БД