如何确定新商品的订单?

时间:2008-09-19 19:21:16

标签: php mysql

我在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 个答案:

答案 0 :(得分:4)

您可以将SELECT作为INSERT的一部分进行,例如:

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

请记住,您希望在order列上添加索引以优化SELECT部分​​。

此外,您可能需要重新考虑tinyint的订单,除非您只期望只有255个订单。

另外,order是一个保留字,你总是需要把它写成`order`,所以你也可以考虑重命名那个列。

答案 1 :(得分:2)

由于您已经自动增加了每个新成员的ID,因此您可以按ID排序。

答案 2 :(得分:0)

我不确定我理解。如果每个用户想要一个不同的订单,您将如何将个人用户首选项存储在“成员”表中的一个字段中?

通常,您只需让用户根据字段的自然顺序进行排序。订单栏的目的是什么?

答案 3 :(得分:0)

通常我按“order,name”命令所有的select语句顺序排列;然后我总是为Order插入相同的值(0或9999999,具体取决于我是第一个还是最后一个)。然后用户可以重新排序,但他们喜欢。

答案 4 :(得分:0)

InnoDB支持交易。在插入之前执行'begin'语句并在完成提交时执行。有关mySql中事务的说明,请参阅this article

答案 5 :(得分:0)

您可以做的是创建一个包含映射到另一个member_id的键(member_id,position)的表。然后,您可以将该表中的顺序与成员列表本身分开存储。 (每个成员都保留自己的列表排序,这就是我想要的......?)

假设您有一个像这样的成员表:

+-----------+--------------+
| 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;

例如,为John Smith的列表运行此查询的结果(即WHERE member_id_key = 1)将是:

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

您可以通过在给定ID的最大位置值中加1来计算添加到列表底部的位置。