Как сохранять и работать с порядком расположения элементов?

Shitbox2
Дата: 07.02.2013 02:25:56
Задача такова:

Есть 10 000 товаров и есть 100 категорий... или даже тегов, т.к. один товар может быть в нескольких категориях. Важно сохранять позиции товаров и потом выводить их в правильном порядке.

Для клиента это выглядит так:
При выборке на страницу выводятся сразу все товары из всех категорий (это просто ссылки <a>), причем с дубликатами (помним, что в разных категориях могут быть одни и те же товары). При этом список прокручивается к первому товару выбранной категории. Дальнейшее переключение категорий уже дело js-скрипта, для чего ему нужны ключевые метки первых товаров каждой категории, которые надо как-то хранить или генерировать.

Пока наковырял что-то такое:

products
idtitlelink
0товар Аwww.site.com/a
1товар Бwww.site.com/b
2товар Вwww.site.com/c
3товар Гwww.site.com/d


menu_items
idpositiontitle
01тег 1
12тег 2
20тег 3


products2menu
idmenu_item_idproduct_idposition
0220
1132
2000
3100
4111

Здесь 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, но запросы в цикле как-то неправильно задавать).

Ну и, вообще, может все нужно по-другому сделать и логику базы поменять, может тормозить все будет, в запросе ошибки есть, как считаете?
MikkiMouse
Дата: 07.02.2013 22:17:27
Shitbox2,

Простейшая задача. Ключевые слова: "связь много-ко-многим" и "ORDER BY". Все. Гуглить до просветления.