Как определить заказ на новый товар? - PullRequest
0 голосов
/ 19 сентября 2008

У меня есть таблица членов в MySQL

CREATE TABLE  `members` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(65) collate utf8_unicode_ci NOT NULL,
  `order` tinyint(3) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

И я хотел бы позволить пользователям заказывать участников так, как им нравится. Я храню заказ в столбце order.

Мне интересно, как вставить нового пользователя, чтобы добавить его в конец списка. Это то, что я имею сегодня:

$db->query('insert into members VALUES (0, "new member", 0)');
$lastId = $db->lastInsertId();
$maxOrder = $db->fetchAll('select MAX(`order`) max_order FROM members');
$db->query('update members 
            SET 
                `order` = ?
            WHERE 
                 id = ?', 
           array(
               $maxOrder[0]['max_order'] + 1, 
               $lastId
        ));

Но это не совсем точно, хотя, когда несколько пользователей добавляют новых участников одновременно, может случиться, что MAX(order) вернет одинаковые значения.

Как вы справляетесь с такими случаями?

Ответы [ 6 ]

4 голосов
/ 19 сентября 2008

Вы можете сделать SELECT как часть ВСТАВКИ, например:

INSERT INTO members SELECT 0, "new member", max(`order`)+1 FROM members;

Имейте в виду, что вы хотите иметь индекс для столбца order, чтобы оптимизировать часть SELECT.

Кроме того, вы можете пересмотреть крошечный ордер на заказ, если только вы не ожидаете получить только 255 заказов.

Кроме того, order - это зарезервированное слово, и вам всегда нужно будет писать его как `order`, так что вы можете рассмотреть и переименование этого столбца.

2 голосов
/ 19 сентября 2008

Поскольку вы уже автоматически увеличиваете идентификатор для каждого нового участника, вы можете заказать по идентификатору.

0 голосов
/ 20 сентября 2008

Что вы можете сделать, это создать таблицу с ключами (member_id, position), которая сопоставляется с другим member_id. Затем вы можете сохранить порядок в этой таблице отдельно от самого списка участников. (Каждый участник сохраняет свой собственный порядок списков, что, как я полагаю, вы хотите ...?)

Предположим, что у вас есть следующая таблица членов:

+-----------+--------------+
| member_id | name         |
+-----------+--------------+
|         1 | John Smith   |
|         2 | John Doe     |
|         3 | John Johnson |
|         4 | Sue Someone  |
+-----------+--------------+

Тогда у вас может быть таблица заказов, подобная этой:

+---------------+----------+-----------------+
| member_id_key | position | member_id_value |
+---------------+----------+-----------------+
|             1 |        1 |               4 |
|             1 |        2 |               1 |
|             1 |        3 |               3 |
|             1 |        4 |               2 |
|             2 |        2 |               1 |
|             2 |        3 |               2 |
+---------------+----------+-----------------+

Вы можете выбрать список участников с учетом сохраненного порядка, используя внутреннее объединение. Например:

SELECT name
FROM members inner join orderings 
  ON members.member_id = orderings.member_id_value
WHERE orderings.member_id_key = <ID for member you want to lookup>
ORDER BY position;

Например, результат выполнения этого запроса для списка Джона Смита (т. Е. WHERE member_id_key = 1) будет:

+--------------+
| name         |
+--------------+
| Sue Someone  |
| John Smith   |
| John Johnson |
| John Doe     |
+--------------+

Вы можете рассчитать позицию для добавления в конец списка, добавив единицу к максимальному значению позиции для данного идентификатора.

0 голосов
/ 19 сентября 2008

InnoDB поддерживает транзакции. Перед вставкой сделайте инструкцию 'begin', а когда вы закончите, сделайте коммит. См. эту статью для объяснения транзакций в mySql.

0 голосов
/ 19 сентября 2008

Обычно я делаю все свои операторы выбора по порядку «заказ, имя»; Затем я всегда вставляю одно и то же значение для Order (0 или 9999999 в зависимости от того, хочу я их первым или последним). Тогда пользователь может изменить порядок, как ему нравится.

0 голосов
/ 19 сентября 2008

Я не уверен, что понимаю. Если каждому пользователю нужен другой порядок, как вы будете хранить индивидуальные настройки пользователя в одном поле в таблице «members»?

Обычно вы просто разрешаете пользователям делать заказы на основе естественного порядка полей. Какова цель поля заказа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...