Как динамически создать ценовой диапазон с помощью PHP - PullRequest
1 голос
/ 10 июля 2020

Я уже видел другой связанный с этим вопрос, но это не то, что мне нужно. Ссылка -> this

Я хочу создать фильтр ценового диапазона для сайта электронной коммерции. На многих сайтах есть динамический c фильтр ценового диапазона.

<label>Less than $500 (800) <input type="checkbox" name="price[]" value="1"/></label>
<label>$500 - $1.000 (921) <input type="checkbox" name="price[]" value="2"/></label>
<label>More than $1.000 (1021) <input type="checkbox" name="price[]" value="3"/></label>

Например, аксессуары стоимостью менее 500 долларов США и обувь более 1000 долларов США (если пользователь входит в каталог) Если пользователь входит в категории, это должно измениться на что-то вроде этого

<label>Less than $1.500 (40) <input type="checkbox" name="price[]" value="1"/></label>
<label>$1500 - $2.000 (43) <input type="checkbox" name="price[]" value="2"/></label>
<label>More than $2.000 (50) <input type="checkbox" name="price[]" value="3"/></label>

Я использую PHP, Jquery & MySQL.

Не беспокойтесь о запросах после, потому что я буду использовать уже метод, который работает для диапазона. Проблема здесь в том, как динамически генерировать группы.

Заранее большое спасибо. Это мой самый первый пост здесь. Думаю, я объяснил это. Надеюсь, вы можете мне помочь!

EDIT:

Идея состоит в том, что фильтр показывает примерно следующее:

  • Первые 30% товаров в 1-м ценовом диапазоне
  • Последующие 33% во 2-м ценовом диапазоне
  • Последние 37% в 3-м ценовом диапазоне

Процент не важен, но должен быть сбалансированным.

Я добавлю несколько изображений для справок

Ценовой фильтр Amazon для ПК

Изображение ценового фильтра Amazon для ПК

Ценовой фильтр Amazon для Macbook

Ценовой фильтр Amazon для Macbook

Мне нужно знать, КАК ПОЛУЧИТЬ диапазоны. Диапазоны ДОЛЖНЫ БЫТЬ динамическими c в зависимости от количества.

ОТВЕТ:

Спасибо за ответ @ markus-ao

вот мое решение этой проблемы:

Сначала подсчитайте общее количество строк таблицы.

т.е. 1000 строк, разделенных на 3 -> 333

Используйте LIMIT, чтобы получить средний диапазон от 33% до 66% от общей суммы.

SELECT min(price) mini, max(price) maxi
from (SELECT price FROM products order by price ASC limit 333, 333) x

И вы можете использовать это как это

$lessthan = $results['mini'];
$morethan = $results['maxi'];

echo '<button>Less than $lessthan</button>
<button>$lessthan - $morethan</button>
<button>More than $morethan</button>';

Я, хотя это будет сложнее, но @ markus- ао объяснил очень хорошо.

1 Ответ

1 голос
/ 10 июля 2020

Это не готовый к работе ответ. Следующее даст вам необходимые сведения, чтобы разобраться в этом. Я верю, что вы сможете составить необходимый шаблон PHP SQL самостоятельно, чтобы заполнить пробелы и превратить его в работающую реализацию. (Если нет, наймите меня и моих лолкотов. = ^ O ^ =)

Прежде всего, вы захотите узнать общий план земли в продуктах вашей категории. В примере предполагается таблица products со столбцами с именами price и category.

SELECT
    MIN(price) AS min_price, 
    MAX(price) AS max_price, 
    AVG(price) AS avg_price,
    COUNT(*) AS total_items 
FROM products
WHERE category = 3

Этот запрос даст вам минимальные, средние и максимальные цены в данной категории, а также общую количество предметов. (Нам действительно нужен здесь только общий счет, не стесняйтесь удалять min / max / avg, если они не нужны.) Давайте возьмем это с помощью PHP в переменную $cat (или $meow). Затем, теперь, когда мы знаем общее количество продуктов, мы можем найти МАКСИМАЛЬНОЕ для первых 33% и МИНУЮ для последних 33% продуктов для кошек, чтобы получить точки разрыва для наших сбалансированных ценовых диапазонов.

// Assuming 1000 items, one third floored is 333.

$rangesize = floor($cat['total_items'] / 3);

// Get the min/max/total of the bottom 1/3, let's imagine we fetch it into $low:

SELECT 
    MIN(price) as low_min,
    MAX(price) as low_max,
    COUNT(*) AS low_total 
FROM (SELECT price FROM products 
WHERE category = 3
ORDER BY price ASC
LIMIT 0, $rangesize) low_prices // lowest price first, first 1/3 of records

Здесь пункты ORDER и LIMIT сужают нас до самых дешевых позиций от 0 до 333. COUNT(*) здесь действительно немного избыточно, поскольку мы уже знаем количество элементов, которыми мы ограничили запрос. Во всяком случае, вот оно. Не стесняйтесь удалить его и просто используйте $rangesize позже для итогов.

// Get the min/max/total of the top 1/3, let's imagine we fetch it into $high:

SELECT 
    MIN(price) as high_min,
    MAX(price) as high_max,
    COUNT(*) AS high_total
FROM (SELECT price FROM products 
WHERE category = 3
ORDER BY price DESC
LIMIT 0, $rangesize) high_prices // highest price first, first 1/3 of records

Здесь пункты ORDER и LIMIT сужают нас до 0-333 самых дорогих позиций. Изменить: Мы используем подзапрос, чтобы получить набор результатов с X наименьшими ценами. Это потому, что агрегаты MIN/MAX/AVG обрабатываются до предложений ORDER/LIMIT. (COUNT, однако, отражает окончательный результат.)

Тогда у нас есть все необходимые данные. А теперь давайте все вместе. DynGroup :: CompilesThou (!)

$group = [
    'low' => [ 
        'start' => $low['low_min'],
        'end' => $low['low_max'],
        'total' => $low['low_total']
    ],
    'mid' => [
        'start' => $low['low_max'],
        'end' => $high['high_min'],
        'total' => ($cat['total_items'] - $low['low_total'] - $high['high_total']) 
    ],
    'high' => [ 
        'start' => $high['high_min'],
        'end' => $high['high_max'],
        'total' => $high['high_total']
    ]
];

Итак, у вас есть образец группы динамического диапазона c, готовый к работе. Вы заметите, что мы извлекли средние значения из нижнего и верхнего значений, а не выполняли еще один запрос. Надеюсь, вы знаете, как превратить массив в HTML ярлыки и флажки.

Если вы хотите создать больше параметров, просто измените делитель для всех продуктов (в нашей строке $rangesize = ранее) и добавьте необходимые запросы, чтобы получить нужные данные. Для пяти вариантов разделите на 5 и добавьте запросы для диапазонов lowMid и midHigh, каждый по 20% от общего количества. Если вы хотите иметь 30/40/30 или что-то еще, просто выполните необходимые математические вычисления et c.

Вероятно, вы захотите кэшировать свои расчеты и периодически обновлять sh их. (У меня был бы только один сценарий обслуживания, который выполняет итерацию по всем категориям и сохраняет их для внешнего использования.)

Чтобы убедиться, что у вас нет продуктов ниже границы запроса, вам понадобится low-end запрос к на самом деле искать цены в диапазоне от 0 до low_max (вместо указанного диапазона), в случае, если вы добавляете продукт дешевле, чем минимум на записи между кешами освежает. То же самое и для запроса high-end , лучше ищите high_min -9999999 или что-то еще. Просто WHERE price > $high_min и price < $low_max AND category = 3 сделают свою работу.

Имея достаточно времени, энтузиазма и ловкости, умный SQL мастер, вероятно, сможет собрать все вышеперечисленное в один сложный запрос с подзапросами и прочим. . Я чувствовал, что это более образовательный путь для ответа. Надеюсь, поможет. Удачного крафта; дайте мне знать, если что-то неясно.

...