Привет всем! Появилась проблема. Хочу сделать фильтрацию по рейтингу как http://www.tripadvisor.ru/HACSearch?geo=298570 (слева) И так начнем по порядку Начну по порядку. Есть таблица list (id,street,stars,`city`,`country`) stars - это рейтинг, до 5 звезд. На странице вывода этих записей search_list.php, устанавливаю checkboxs для фильтрации по рейтингу. Код (Text): <input type="checkbox" name="stars1" value="1"> 1 stars <input type="checkbox" name="stars2" value="2"> 2 stars <input type="checkbox" name="stars3" value="3"> 3 stars <input type="checkbox" name="stars4" value="4"> 4 stars <input type="checkbox" name="stars5" value="5"> 5 stars Получаю значения с помощью аякс Код (Text): <script type="text/javascript"> jQuery(document).change(function(){ var stars_query1 = $('input:checkbox[name=stars1]:checked').val(); var stars_query2 = $('input:checkbox[name=stars2]:checked').val(); var stars_query3 = $('input:checkbox[name=stars3]:checked').val(); var stars_query4 = $('input:checkbox[name=stars4]:checked').val(); var stars_query5 = $('input:checkbox[name=stars5]:checked').val(); jQuery("#search").load('lib/search.php',{stars1:stars_query1,stars2:stars_query2,stars3:stars_query3,stars4:stars_query4,stars5:stars_query5},$("#load_search").fadeIn(),$("#load_search").fadeOut()); }); </script> Вывод идет на страницу search.php и код получается сначала такой Код (Text): $stars1 = $_POST['stars1']; $stars2 = $_POST['stars2']; $stars3 = $_POST['stars3']; $stars4 = $_POST['stars4']; $stars5 = $_POST['stars5']; $result_list = mysql_query("SELECT `street`,`id`,`stars` FROM `list` WHERE `city`=".(int)$_POST['city']." AND `country`='".$_POST['country']."'"); while ($list = mysql_feth_array($result_list)) { echo $list['street']."<br>"; } Нужно как из этих значений оформить запрос. Пытался сделать что то такое Код (Text): if ($_POST['stars1'] == 1) {$stars1 = 'AND `stars`=1'; if ($_POST['stars2'] == 2) {$stars1 = 'AND (`stars`=1 OR `stars`=2)'; if ($_POST['stars3'] == 3) {$stars1 = 'AND (`stars`=1 OR `stars`=2 OR `stars`=3)';} if ($_POST['stars4'] == 4) {$stars1 = 'AND (`stars`=1 OR `stars`=2 OR `stars`=3 OR `stars`=4)';} if ($_POST['stars5'] == 5) {$stars1 = 'AND (`stars`=1 OR `stars`=2 OR `stars`=3 OR `stars`=4 `stars`=5)';} } } $result_list = mysql_query("SELECT `street`,`id`,`stars` FROM `list` WHERE `city`=".(int)$_POST['city']." AND `country`='".$_POST['country']."' $stars1"); Но вариантов будет очень много, да и код не правильный. Но нужно думаю что то такое AND (`stars`=1 OR `stars`=2). Подскажите как сделать?
macbeth9, доброго Вам времени суток. Как вариант{ Нужно всего 5 запросов (для каждого значения `stars`). Создается массив $array. В $array[1] помещаются (если пользователь выбрал 1-звездочные) записи со `stars` = 1... В $array[5] помещаются (если пользователь выбрал 5-звездочные) записи со `stars` = 5. И тупо выводится весь массив $array. }
Доброго времени суток, macbeth9, и всем остальным. Код (Text): $q = "SELECT columns FROM table WHERE заведомо_ложное_условие"; //Условие, например, '1 = 0' $q1 = $q2 = $q3 = $q4 = $q5 = ""; if($_POST['stars1'] == 1) $q1 = " OR stars = 1"; if($_POST['stars2'] == 2) $q2 = " OR сstars = 2"; if($_POST['stars3'] == 3) $q3 = " OR stars = 3"; if($_POST['stars4'] == 4) $q4 = " OR stars = 4"; if($_POST['stars5'] == 5) $q5 = " OR stars = 5"; $q .= $q1 . $q2 . $q3 . $q4 . $q5; mysql_query($q); // или mysqli_query($q); Надеюсь помог.
Спасибо, все работает, только есть одно но. У меня записи выводятся с условием WHERE `city`=1 AND `country`=100 И запрос формируется таким образом Код (Text): SELECT `street`,`id`,`price`,`stars`,`borough`,`price_date` FROM `list` WHERE `city`=20944 AND `country`='RU' OR `stars`=2 OR `stars`=3 Получается что, выводим ГДЕ ГОРОД=1 И СТРАНА=100 ИЛИ ЗВЕЗДА=2 ИЛИ ЗВЕЗДА 3. Запрос выводит записи отвечающие первой части условия так и второй независимо от города и страны. По идее что сохранить первое условие нужно вот так WHERE city=1 AND `country`=100 AND (`stars`=1 OR `stars`=2 OR `stars`=3) И вот если нажат один чекбокс, запрос становится вида WHERE city=1 AND `country`=100 AND `stars`=1 А если уже два то формируется таким образом WHERE city=1 AND `country`=100 AND (`stars`=1 OR `stars`=2) Вот здесь и есть проблема, как такое сделать. uorypm практический правильно подсказал, но пример не учитывает первое условие.
И снова доброго Вам времени суток, macbeth9. Была предложена идея реализации задачи, а не само решение. Если прочитаете свое сообщение еще раз, то сразу поймете, что именно и где надо дописать или переписать. Эх, не любите Вы думать. Поэтому ловите. Код (Text): $q = "SELECT columns FROM table WHERE `city`= какое-то_число AND `country`= 'какая-то_локаль' AND (заведомо_ложное_условие"; $q1 = $q2 = $q3 = $q4 = $q5 = ""; if($_POST['stars1'] == 1) $q1 = " OR stars = 1"; if($_POST['stars2'] == 2) $q2 = " OR stars = 2"; if($_POST['stars3'] == 3) $q3 = " OR stars = 3"; if($_POST['stars4'] == 4) $q4 = " OR stars = 4"; if($_POST['stars5'] == 5) $q5 = " OR stars = 5"; $q .= $q1 . $q2 . $q3 . $q4 . $q5 . ")"; mysql_query($q); // или mysqli_query($q); Обратите внимание на наличие открывающейся круглой скобки в начале формирования запроса - это не опечатка. 'Заведомо_ложное_условие' надеюсь понятно для чего нужно или объяснить? Надеюсь мое решение Вам помогло. Также обратите внимание, что если ни один пункт чекбокса не выбран, то запрос вернет пустую таблицу.
Спасибо! Все прекрасно работает, то что надо. Но можно еще вопрос? А если у меня еще есть поле например type, по которому мне тоже нужно делать фильтр, совместно с полем stars. Как мне сделать два условия?
Здравствуйте, macbeth9. Все делается аналогично. Код (Text): $q = "SELECT columns FROM table WHERE `city`= какое-то_число AND `country`= 'какая-то_локаль' AND (заведомо_ложное_условие"; $q1 = $q2 = $q3 = $q4 = $q5 = ""; if($_POST['stars1'] == 1) $q1 = " OR stars = 1"; if($_POST['stars2'] == 2) $q2 = " OR stars = 2"; if($_POST['stars3'] == 3) $q3 = " OR stars = 3"; if($_POST['stars4'] == 4) $q4 = " OR stars = 4"; if($_POST['stars5'] == 5) $q5 = " OR stars = 5"; $q .= $q1 . $q2 . $q3 . $q4 . $q5 . ") AND (заведомо_ложное_условие2"; $type1 = $type2 = $type3 = ... = $typeN = ""; if($_POST['type1'] == 1) $type1 = " OR type1 = 1"; if($_POST['type2'] == 2) $type2 = " OR type2 = 2"; if($_POST['type3'] == 3) $type3 = " OR type3 = 3"; // ... if($_POST['typeN'] == 5) $typeN = " OR typeN = N"; $q .= $type1 . $type2 . $type3 . ... . $typeN . ")"; mysql_query($q); // или mysqli_query($q); Если допустимо, что пользователь может не выбирать тип 'typeN', то 'заведомо_ложное_условие2' превращается в 'заведомо_истинное_условие'.
Код получился такой Код (Text): $result_list = "SELECT `street`,`id`,`price`,`stars`,`borough`,`price_date` FROM `list` WHERE `city`=".(int)$_POST['city']." AND `country`='".$country."' AND (1=0"; $q1 = $q2 = $q3 = $q4 = $q5 = ""; if($_POST['stars1'] == 1) $q1 = " OR `stars`=1"; if($_POST['stars2'] == 2) $q2 = " OR `stars`=2"; if($_POST['stars3'] == 3) $q3 = " OR `stars`=3"; if($_POST['stars4'] == 4) $q4 = " OR `stars`=4"; if($_POST['stars5'] == 5) $q5 = " OR `stars`=5"; $result_list .= $q1 . $q2 . $q3 . $q4 . $q5 . ") AND (2=0"; $type1 = $type2 = $type3 = $type4 = $type5 = ""; if($_POST['cottage'] == 'cottage') $type1 = " OR `type`='cottage'"; if($_POST['apart'] == 'apartament') $type2 = " OR `type`='apartament'"; if($_POST['villa'] == 'villa') $type3 = " OR `type`='villa'"; if($_POST['castle'] == 'castle') $type4 = " OR `type`='castle'"; if($_POST['house'] == 'house') $type5 = " OR `type`='house'"; $result_list .= $type1 . $type2 . $type3 . $type4 . $type5 . ")"; Он работает если например выбрать сразу stars и type, а вот если одно из них, то нет. Если одно выбираешь то запрос получается такой WHERE `city`=20944 AND `country`='RU' AND (1=0) AND (2=0 OR `type`='house')
Уважаемый macbeth9, читайте внимательно то, что Вам пишу: 1. 2. Вывод: Если же допустимо, что пользователь вообще ничего не выбирает, то везде 'заведомо_ложное_условие' превращается в 'заведомо_истинное_условие' (например в '1 = 1'). Т.е.