программирую(пытаюсь) инет-магазин, подключил фильтр по 4 параметрам, дошла очередь до 5. им оказался параметр возраст.
что имею: в БД для каждой записи есть поле с возрастом, например:
1 -> 0,1,2,3
2 -> 6,7,8,9,10
3 -> 0,1
4 -> 3,4,5,6,7,8
задача сделать фильтр элементов с выбором параметров возраста от [] до []
то есть при выборе от [4] до [7] в выдаче будет 2 и 4 элемент
сам могу сделать только если в БД записано одно значение а не несколько
Спустя 5 минут, 55 секунд (27.06.2012 - 15:02) rooor написал(а):
LIKE
Спустя 53 минуты, 2 секунды (27.06.2012 - 15:55) sergeiss написал(а):
Цитата (AndreyChaki @ 27.06.2012 - 15:56) |
что имею: в БД для каждой записи есть поле с возрастом, например: 1 -> 0,1,2,3 2 -> 6,7,8,9,10 3 -> 0,1 4 -> 3,4,5,6,7,8 |
Есть у меня подозрение, что надо "нормализовать" БД, чтобы не было таких вот ляпов. Тогда все выборки станут намного понятнее и проще.
Спустя 5 часов, 39 минут, 54 секунды (27.06.2012 - 21:35) TrashXXX написал(а):
Есть предложение сделать мин и макс возраст и условия в запросе делать.
Спустя 12 часов, 6 минут, 4 секунды (28.06.2012 - 09:41) AndreyChaki написал(а):
Цитата (sergeiss @ 27.06.2012 - 12:55) | ||
Есть у меня подозрение, что надо "нормализовать" БД, чтобы не было таких вот ляпов. Тогда все выборки станут намного понятнее и проще. |
что Вы имеете ввиду под словом нормализовать?
номер записи -> одна ячейка в записи
1 -> 0,1,2,3
2 -> 6,7,8,9,10
3 -> 0,1
4 -> 3,4,5,6,7,8
просто не вижу смысла выливать все значения.
как мне может помочь макс и мин значения?
у меня прямо в фильтре можно вводить возраст от и до и нужно что бы в выборку попадала запись в которой хотя бы одно из значений попадало в указанный диапазон
Спустя 10 минут, 55 секунд (28.06.2012 - 09:52) Invis1ble написал(а):
Цитата |
1 -> 0,1,2,3 2 -> 6,7,8,9,10 3 -> 0,1 4 -> 3,4,5,6,7,8 |
если все записи будут иметь подобный вид, т.е. интервал без "дырок", то лучше сделать min и max поля как советовали выше. Запрос на выборку в таком случае будет вполне тривиальным.
Спустя 4 минуты, 52 секунды (28.06.2012 - 09:56) AndreyChaki написал(а):
будет ли работать на таком примере
товар имеет значения: мин 4 макс 12
посетитель сайта вводит значения
1) от 6 ло 8
2) до 5
3) от 11
все 3 варианта должны выдывать этот товар
товар имеет значения: мин 4 макс 12
посетитель сайта вводит значения
1) от 6 ло 8
2) до 5
3) от 11
все 3 варианта должны выдывать этот товар
Спустя 3 минуты, 19 секунд (28.06.2012 - 10:00) Invis1ble написал(а):
да
Спустя 12 минут, 28 секунд (28.06.2012 - 10:12) AndreyChaki написал(а):
<?php
$vmin = $_GET['vmin ']
$vmax = $_GET['vmax ']
$db->query("select * from catalog2Item where publish='1' and vmin=".$vmin." and vmax=".$vmax." ");
?>
что то хоть немного похожее на это должно быть?
Спустя 5 минут, 14 секунд (28.06.2012 - 10:17) AndreyChaki написал(а):
спрашиваю про диапазоны а сам пишу про точные значения. простите, тогда не понимаю как сделать
появилась идея
where vmin <= $_GET['vmin '] <= vmax || vmin <= $_GET['vmax'] <= vmax
вроде бы похоже на правду. но как записать это в запросе
появилась идея
where vmin <= $_GET['vmin '] <= vmax || vmin <= $_GET['vmax'] <= vmax
вроде бы похоже на правду. но как записать это в запросе
Спустя 16 минут, 18 секунд (28.06.2012 - 10:34) Invis1ble написал(а):
select * from catalog2Item where publish='1' and vmin <= " . $vmin . " and vmax >= " . $vmax
Спустя 3 часа, 17 минут, 42 секунды (28.06.2012 - 13:51) AndreyChaki написал(а):
почти разобрался.
все же знаки наоборот
vmin >= " . $vmin
и
vmax <= " . $vmax
все же знаки наоборот
vmin >= " . $vmin
и
vmax <= " . $vmax
Спустя 44 минуты, 54 секунды (28.06.2012 - 14:36) AndreyChaki написал(а):
<?php
if ($_GET['vmin']!='')
{
$filter.=" and `vmin` >='".$_GET['vmin']."'";
}
if ($_GET['vmax']!='')
{
$filter.=" and `vmax` <='".$_GET['vmax']."'";
}
$sql="select * from `catalog2Item` where 1 $filter order by part";
?>
хм. ведет себя по разному в зависимости от того оба значения выбраны или только одно
Спустя 26 минут, 47 секунд (28.06.2012 - 15:03) sergeiss написал(а):
Цитата (AndreyChaki @ 28.06.2012 - 10:41) |
что Вы имеете ввиду под словом нормализовать? номер записи -> одна ячейка в записи 1 -> 0,1,2,3 2 -> 6,7,8,9,10 3 -> 0,1 4 -> 3,4,5,6,7,8 |
Нормализовать - это чтобы в таблице были такие записи (согласно твоего примера):
Свернутый текст
1 - 0
1 - 1
1 - 2
1 - 3
2 - 6
2 - 7
2 - 8
2 - 9
2 - 10
3 - 1
3 - 2
4 - 3
4 - 4
4 - 5
4 - 6
4 - 7
4 - 8
4 - 9
1 - 1
1 - 2
1 - 3
2 - 6
2 - 7
2 - 8
2 - 9
2 - 10
3 - 1
3 - 2
4 - 3
4 - 4
4 - 5
4 - 6
4 - 7
4 - 8
4 - 9
Тогда любой поиск превращается в простую детскую забаву

В данный же момент, как я могу предположить, у тебя только 4 записи. Где в одном из полей находится некий список. И ты хочешь в нем что-то найти.
Спустя 7 часов, 10 минут, 20 секунд (28.06.2012 - 22:13) Invis1ble написал(а):
Цитата |
все же знаки наоборот |
да
Спустя 9 часов, 38 минут, 45 секунд (29.06.2012 - 07:52) AndreyChaki написал(а):
фильтр сделал, но есть загвоздка.
3 товара, диапазоны возрастов:
1) 0-3
2) 4-12
3) 13-100 (по умолчанию поставил 100 если не указан макс возраст)
при моем коде представленным выше при указании в фильтре диапазона 2-5 товаров не будет выведено. так как учитывается полное вхождение.
не хватает мозгов реализовать частичное вхождение.
что бы при вводе в фильтр 3-13 выдало все 3 товара.
точно так же если ввести в фильтр 5-11, по логике должно вывести второй товар, сейчас же результат пустой
надеюсь Вы поняли о чем я
3 товара, диапазоны возрастов:
1) 0-3
2) 4-12
3) 13-100 (по умолчанию поставил 100 если не указан макс возраст)
при моем коде представленным выше при указании в фильтре диапазона 2-5 товаров не будет выведено. так как учитывается полное вхождение.
не хватает мозгов реализовать частичное вхождение.
что бы при вводе в фильтр 3-13 выдало все 3 товара.
точно так же если ввести в фильтр 5-11, по логике должно вывести второй товар, сейчас же результат пустой
надеюсь Вы поняли о чем я
Спустя 12 минут, 4 секунды (29.06.2012 - 08:04) Invis1ble написал(а):
ну как-то так
select * from catalog2Item where publish='1' and ((vmin >= $vmin and vmin <= $vmax) or (vmax >= $vmin and vmax <= $vmax))
select * from catalog2Item where publish='1' and ((vmin >= $vmin and vmin <= $vmax) or (vmax >= $vmin and vmax <= $vmax))
Спустя 30 минут, 26 секунд (29.06.2012 - 08:35) AndreyChaki написал(а):
первую проблему это решило, частичное вхождение работает если один из параметров попадает в диапазон.
но стоит ввести 6-8 и товар с диапазоном 4-12 уже не отображается
помогло это, спасибо огромное!
но стоит ввести 6-8 и товар с диапазоном 4-12 уже не отображается
and (((vmin >= $vmin and vmin <= $vmax) or (vmax >= $vmin and vmax <= $vmax)) or (vmin <= $vmin and vmax >= $vmax))
помогло это, спасибо огромное!
Спустя 5 минут, 54 секунды (29.06.2012 - 08:41) Invis1ble написал(а):
Цитата |
or (vmin <= $vmin and vmax >= $vmax) |
а, ну да. это я не учел. пожалуйста