[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Алгоритм вывода информации
olya-kowka
Друзья! Всем добрый день!

Помогите продумать алгоритм вывода информации на странице сайта.

У меня есть интернет-магазин, в нем я продаю игрушки, например.
С помощью фильтра я могу выбрать нужный мне товар, который отображается по 3 изделия в строке и по 21 шт. в столбце:

-----------------------------------------------------
Игрушка1 Игрушка 2 Игрушка 3
Фирма 1 Фирма 2 Фирма 2
Цена 1 Цена 2 Цена3

------------------------------------------------------
Игрушка4 Игрушка 5 Игрушка 6
Фирма 4 Фирма 1 Фирма 6
Цена 4 Цена 5 Цена6


Задача заключается в том, чтобы этот вывод был организован следующим образом:

На первых страницах необходимо:
  • отображать модели из брендов ТОП 30, они мне известны.
  • модели должны быть топовыми, распродажными и т.д.
  • При этом порядок моделей на странице определяется еще и ценой:
    сортировка идет по вертикали по цене от самой дорогой слева в первой ячейке, затем по уменьшению во втором столбце. А вот третий столбец формируется следующим образом: снизу идут модели по уменьшению цены вверх, но верхние три позиции жестко забиты под определенными марками. При этом надо стремиться к тому, чтобы на каждой странице было как можно меньше повторяющихся брендов.
Я не совсем могу понять, за что браться?

Мои таблицы, из которых производится выборка, выглядят так:

Таблица Бренды

1000 - означает первоочередной порядок вывода, назовем это ТОП 30


CREATE TABLE `brands` (
`idb` mediumint(4) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL DEFAULT '',
`descr` text NOT NULL,
`sort_prioritet` int(5) NOT NULL DEFAULT '0' COMMENT 'приоритет вывода марки при отображении',
PRIMARY KEY (`idb`)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=828 ;

INSERT INTO `brands` VALUES (1, 'TC1', 'toy company1', 0);
INSERT INTO `brands` VALUES (2, 'TC2', 'toy company2', 0);
INSERT INTO `brands` VALUES (3, 'TC3', 'toy company3', 1000);
INSERT INTO `brands` VALUES (4, 'TC4', 'toy company4', 1000);


Таблица Игрушки


CREATE TABLE `toys` (
`idw` int(11) NOT NULL AUTO_INCREMENT,
`idb` mediumint(4) NOT NULL DEFAULT '0',
`price` float NOT NULL DEFAULT '0',
`new` tinyint(1) NOT NULL COMMENT 'является изделие новинкой - 1',
`sfb` int(1) NOT NULL DEFAULT '100000' COMMENT 'сортировка моделей внутри бренда от 1 и выше',
PRIMARY KEY (`idw`),
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=120430 ;


INSERT INTO `toys` VALUES (8487, 1, 'Кролик', 9000, 0, 100000);
INSERT INTO `toys` VALUES (8491, 1, 'Медведь', 8729, 0, 2);
INSERT INTO `toys` VALUES (996, 1, 'Кукла', 27270, 1, 1);
INSERT INTO `toys` VALUES (1085, 2, 'Лопатка', 214, 0, 100000);
INSERT INTO `toys` VALUES (71301, 2, 'Лиса', 6999, 1, 1);
INSERT INTO `toys` VALUES (1182, 2, 'Дракон', 22299, 1, 2);
INSERT INTO `toys` VALUES (1317, 3, 'Кабан', 29889, 1, 1);
INSERT INTO `toys` VALUES (7693, 3, 'Собака', 110499, 1, 3);
INSERT INTO `toys` VALUES (1404, 4, 'Ведро', 956, 1, 100000);
INSERT INTO `toys` VALUES (1416, 4, 'Машинка', 1292, 0, 100000);



Я, честно говоря, в растерянности....



Спустя 18 минут, 5 секунд (5.03.2012 - 16:00) Visman написал(а):
Цитата (olya-kowka @ 5.03.2012 - 20:42)
Я, честно говоря, в растерянности....

С представленным набором данных (выше) в каком порядке должны выводиться объекты на странице?

Спустя 28 минут, 42 секунды (5.03.2012 - 16:28) olya-kowka написал(а):
Visman,

если придерживаться только ценового параметра и алгоритма расположения по цене, то результат такой

---------------------------
Собака | Кролик | Лопатка
Кабан | Медведь | Ведро
Кукла | Лиса | Машинка
Дракон |

------------------

Но в то же время я не учла, что какие-то бренды являются в ТОП 30 и они должны быть приоритетными в начале выдачи. Хотя это кажется мне невозможным, т.к. непосредственная выдача идет по цене.

Спустя 22 минуты, 51 секунда (5.03.2012 - 16:51) Visman написал(а):
SELECT t.idw, t.price, t.new, t.sfb, c.idb, c.name, c.descr, c.sort_prioritet FROM toys AS t INNER JOIN brands as b ON (b.idb = t.idb) ORDER BY c.sort_prioritet DESC, t.sfb DESC, t.price DESC

Запрос без условия.
Порядок сортировки по приоритетам:
1. по полю sort_prioritet таблицы брэндов в обратном порядке.
2. по полю sfb таблицы товаров в обратном порядке
3. по полю price таблицы товары
т.е. сначала брэнды - внутри сначала более ценные брэнды - внутри сначала более ценные товары
потом все остальные товары по уменьшению цены.

Цитата (olya-kowka @ 5.03.2012 - 20:42)
А вот третий столбец формируется следующим образом: снизу идут модели по уменьшению цены вверх, но верхние три позиции жестко забиты под определенными марками.

Отдельные запрос на три товара надо добавить и потом при выводе в три колонки на php для начала третей колонки брать данные из этого запроса.

Спустя 33 минуты, 51 секунда (5.03.2012 - 17:25) olya-kowka написал(а):
Спасибо за помощь.

В принципе у меня сортировка так и реализована, за исключением сортировки по полю sfb, она сделана в направлении возрастания, т.к. самые топовые модели помечены от 1 и выше.

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

Теперь мне осталось понять, как при моей верстке в строку располагать модели по вертикали.

Вероятно, средствами php надо перебирать массив....

Спустя 1 час, 33 минуты, 45 секунд (5.03.2012 - 18:59) Visman написал(а):
Цитата (olya-kowka @ 5.03.2012 - 22:25)
Вероятно, средствами php надо перебирать массив....

Да, только так.
Можно сделать двойной цикл, внешний на 7 строк, внутренний на 3 столбца.
Если у нас внутренний цикл = 3, а внешний < 4 и во втором массиве есть не взятый элемент, то берем данные из массива второго запроса, в остальных случаях из первого.
Правда с постраничной навигацией может получиться несовпадение, если во втором запросе не будет данных или они будут отличаться от трех.

Спустя 14 часов, 20 минут, 5 секунд (6.03.2012 - 09:19) olya-kowka написал(а):
Получается проблема вот в чем.

У меня 21 позиция на странице.
Я беру данные в запросе по лимиту limit 0, 21, затем доп. запрос на три конкретные марки. Если во втором запросе я что-то нахожу, удовлетворяющее условиям, значит, от 1 до 3-х позиций последних из первого запроса у меня пропадут для вывода и уже на следующей странице я их не покажу. Вероятно, не покажу вообще нигде, потому что я не запомнила, что n кол-во позиций у меня не отобразилось на какой-то странице....

В то же время, если я возьму 19 позиций из запроса limit 0, 19, а во втором запросе на фикс. марки я не найду вообще ничего, то не смогу дополнить страницу до 21-й позиции и будет некорректное отображение.

Верно рассуждаю? Что можно тут придумать? huh.gif

Спустя 2 часа, 39 минут, 18 секунд (6.03.2012 - 11:58) Visman написал(а):
Бери для первого запроса limit x, 21 , где x = (p - 1) * 18, тут p - номер страницы вывода.
Тогда на каждой странице запроса будут макисмум повторятся 3 товара с предыдущей страницы (если там нет товаров из второго запроса) и ни один товар не потеряется.

Спустя 13 дней, 21 час, 44 минуты, 36 секунд (20.03.2012 - 09:43) olya-kowka написал(а):
Visman, спасибо. smile.gif


_____________
Столько дел...Не успеваю на все забить!!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.