Задача такова:
Есть 10 000 товаров и есть 100 категорий... или даже тегов, т.к. один товар может быть в нескольких категориях. Важно сохранять позиции товаров и потом выводить их в правильном порядке.
Для клиента это выглядит так:
При выборке на страницу выводятся сразу все товары из всех категорий (это просто ссылки <a>), причем с дубликатами (помним, что в разных категориях могут быть одни и те же товары). При этом список прокручивается к первому товару выбранной категории. Дальнейшее переключение категорий уже дело js-скрипта, для чего ему нужны ключевые метки первых товаров каждой категории, которые надо как-то хранить или генерировать.
Пока наковырял что-то такое:
products
| id | title | link | | 0 | товар А | www.site.com/a | | 1 | товар Б | www.site.com/b | | 2 | товар В | www.site.com/c | | 3 | товар Г | www.site.com/d |
|
menu_items
| id | position | title | | 0 | 1 | тег 1 | | 1 | 2 | тег 2 | | 2 | 0 | тег 3 |
|
products2menu
| id | menu_item_id | product_id | position | | 0 | 2 | 2 | 0 | | 1 | 1 | 3 | 2 | | 2 | 0 | 0 | 0 | | 3 | 1 | 0 | 0 | | 4 | 1 | 1 | 1 |
|
Здесь position это номер позиции в пределах своей категорииАдминка функционирует так:
Админ создает категорию, добавляет/удаляет/сортирует товары (перетаскивание js-скриптом). При добавлении/удалении/смены позиции на сервер в функцию сохранения посылается строка вида {id-товара: n-позиции,...}. Функция работает так:
//$positions - строка с позициями
//$cat_id - категория где происходит сортировка
$positionsTmp = array();
foreach ($positions as $k => $v) {
$positionsTmp[] = "('" . $cat_id . "', '" . intval($v) . "', '" . intval($k) . "')";
}
$values = " values " . implode(", ", $positionsTmp);
mysql_query("insert into `products2menu` (`menu_item_id`, `product_id`, `position`) " . $values . " on duplicate key update `position` = values(`position`)");
Вроде должно работать. Хотя проверял только на более простых примерах. Интересует как написать запрос, который выводил бы все товары исходя из позиции самой категории и позиции товара в ней, а заодно помечал бы первый товар каждой категории особым образом (можно это сделать в цикле php, но запросы в цикле как-то неправильно задавать).
Ну и, вообще, может все нужно по-другому сделать и логику базы поменять, может тормозить все будет, в запросе ошибки есть, как считаете?