Выборка соседних записей
Есть каталог - группы (дерево), есть продукты, есть сортировка, нужно вытащить соседние товары (предыдущий и следующий), товаров пока не знаю сколько будет,
возможно очень много.
Структура бд:
Столбцы
Сделал следующие SQL-ники:
Но что-то меня смущает, есть ли более правильный вариант решения этой несколько типичной задачи? Может быть стоит лучше хранить данные о соседних товарах в информации о товаре? Обновлять после изменения товаров в группе и их сортировки?
Есть каталог - группы (дерево), есть продукты, есть сортировка, нужно вытащить соседние товары (предыдущий и следующий), товаров пока не знаю сколько будет,
возможно очень много.
Структура бд:
Код:
CREATE TABLE `catalogProducts` (
`id` int(10) unsigned NOT NULL auto_increment,
`productTitle` tinytext,
`ownerId` int(10) unsigned NOT NULL default '0',
`redirect` tinytext,
`smallDescription` text,
`fullDescription` text,
`lang` tinytext,
`position` int(10) unsigned default '0',
`productMainPhoto` tinytext,
`showMainPhoto` enum('1','0') NOT NULL,
`publicInInformationBlock` enum('0','1') NOT NULL,
`cost` float default '0',
`oldcost` tinytext,
`rest` tinyint(4) NOT NULL default '1',
`articul` tinytext NOT NULL,
`age` tinytext,
`discount` tinyint(4) NOT NULL,
`date` date NOT NULL,
`new` tinyint(4) default '1',
`material` tinytext NOT NULL,
PRIMARY KEY (`id`),
KEY `ownerId` (`ownerId`),
KEY `ownerIdPPosition` (`ownerId`,`position`),
KEY `ownerIdPPositionPId` (`ownerId`,`position`,`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
Код:
ownerId - группа товара
position - позиция (сортировка) товара, может иметь не уникальные значения в таблице
(что-то вроде 0, 2, 4, 5, 6, 6, 8, 9), юзер стрелками двигает товар, имеет возможность вручную проставить сортировку (целые числа).
Сделал следующие SQL-ники:
Код:
mysql> EXPLAIN SELECT `id` FROM `catalogProducts` WHERE `ownerId` = '3' && `position` <= '1' && `id` != '1' ORDER BY `position` LIMIT 0,1;
+----+-------------+-----------------+------+------------------------------------------------------+---------------------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+------------------------------------------------------+---------------------+---------+-------+------+--------------------------+
| 1 | SIMPLE | catalogProducts | ref | PRIMARY,ownerId,ownerIdPPosition,ownerIdPPositionPId | ownerIdPPositionPId | 4 | const | 1 | Using where; Using index |
+----+-------------+-----------------+------+------------------------------------------------------+---------------------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)
Код:
mysql> EXPLAIN SELECT `id` FROM `catalogProducts` WHERE `ownerId` = '3' && `position` >= '1' && `id` != '1' ORDER BY `position` LIMIT 0,1;
+----+-------------+-----------------+------+------------------------------------------------------+---------------------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+------------------------------------------------------+---------------------+---------+-------+------+--------------------------+
| 1 | SIMPLE | catalogProducts | ref | PRIMARY,ownerId,ownerIdPPosition,ownerIdPPositionPId | ownerIdPPositionPId | 4 | const | 1 | Using where; Using index |
+----+-------------+-----------------+------+------------------------------------------------------+---------------------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)
mysql>