Это не готовый к работе ответ. Следующее даст вам необходимые сведения, чтобы разобраться в этом. Я верю, что вы сможете составить необходимый шаблон 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 мастер, вероятно, сможет собрать все вышеперечисленное в один сложный запрос с подзапросами и прочим. . Я чувствовал, что это более образовательный путь для ответа. Надеюсь, поможет. Удачного крафта; дайте мне знать, если что-то неясно.