Php 如何确定新项目的订单?

Php 如何确定新项目的订单?,php,mysql,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; 我想让用户按照他们喜欢的方

我在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)
可能会返回相同的值


您如何处理此类情况?

由于您已经自动增加每个新成员的id,您可以按id订购。

由于您已经自动增加每个新成员的id,您可以按id订购。

我不确定是否理解。如果每个用户需要不同的顺序,您将如何在“members”表中的单个字段中存储单个用户首选项


通常,您只允许用户根据字段的自然顺序进行排序。“订单”字段的用途是什么?

我不太清楚。如果每个用户需要不同的顺序,您将如何在“members”表中的单个字段中存储单个用户首选项


通常,您只允许用户根据字段的自然顺序进行排序。“顺序”字段的用途是什么?

通常我将所有select语句按“顺序、名称”排序;然后,我总是为Order插入相同的值(0或9999999,取决于我是第一个还是最后一个)。然后用户可以按自己喜欢的方式重新排序。

通常我让所有select语句按“顺序、名称”排序;然后,我总是为Order插入相同的值(0或9999999,取决于我是第一个还是最后一个)。然后用户可以随意重新排序。

InnoDB支持事务。在insert之前执行“begin”语句,完成后执行commit语句。有关mySql中事务的说明,请参阅。

InnoDB支持事务。在insert之前执行“begin”语句,完成后执行commit语句。有关mySql中事务的说明,请参阅。

您可以在插入过程中进行选择,例如:

INSERT INTO members SELECT 0, "new member", max(`order`)+1 FROM members; 插入到成员中,从成员中选择0,“新成员”,最大(`order`)+1; 请记住,您希望在
order
列上有一个索引,以优化所选零件

此外,您可能需要重新考虑tinyint for order,除非您只希望有255个订单


顺序也是一个保留字,你总是需要把它写成‘顺序’,所以你也可以考虑重命名该列。

你可以将选择作为插入的一部分,如:

。 INSERT INTO members SELECT 0, "new member", max(`order`)+1 FROM members; 插入到成员中,从成员中选择0,“新成员”,最大(`order`)+1; 请记住,您希望在
order
列上有一个索引,以优化所选零件

此外,您可能需要重新考虑tinyint for order,除非您只希望有255个订单


顺序也是一个保留字,你总是需要把它写成“订单”,所以你也可以考虑重命名该列。

你可以做的是创建一个带有键(成员身份,位置)的表,该表映射到另一个成员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 |
+---------------+----------+-----------------+
然后,您可以有一个如下的订购表:

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

您可以通过将一个添加到给定id的最大位置值来计算添加到列表底部的位置。

您可以使用映射到另一个成员id的键(成员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 |
+---------------+----------+-----------------+
然后,您可以有一个如下的订购表:

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

您可以通过将一个添加到给定id的“最大位置”值来计算添加到列表底部的位置。

事务处理是可以的,但您仍然不能阻止使用相同的
顺序的两个项目,因为我们只有一个select和一个update查询。在不同的情况下,当您进行几次插入/更新时,事务会有所帮助……您完全正确。我的回答不能解决你的问题。感谢您的评论。事务处理很好,但您仍然没有阻止拥有两个具有相同
订单的项目,因为我们只有一个select和一个update查询。在不同的情况下,当您进行几次插入/更新时,事务会有所帮助……您完全正确。我的回答不能解决你的问题。谢谢你的评论。如果同时插入,我试图防止两个项目具有相同的
顺序
值。我正在插入
订单
为“0”的项目,然后尝试查找尚未获取的新
订单
值,但如果两个用户同时执行此操作,我将得到两个相等的值。我正在尝试防止同时插入具有相同
订单
值的两个项目。我正在插入
order
为“0”的项目,然后尝试查找尚未获取的新
order
值,但如果两个用户同时执行此操作,我将以两个相等的值结束。backticks是如何在mysql中转义字段名的-他在示例中做得很好。backticks是如何在mysql中转义字段名的-他在示例中做得很好。