我在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)
可能会返回相同的值。
你如何处理这类案件?
答案 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来计算添加到列表底部的位置。