我正在尝试使用以下结构更新数据库表:
user_id, group_id, other_data, sequence
user_id
指向包含所有用户数据的用户表,group_id
指向组信息表中的记录。 other_data
并不重要。 sequence
是一个值,用于确定用户列出的顺序。例如,如果我从group_id
1234提取所有人,sequence
用于按顺序排列。
我正在尝试运行更新以在从表中删除用户时更改此序列。目前,我正在使用运行SELECT查询的CFML脚本,循环遍历它,然后进行单独更新。我想要做的是在一个查询中写下整个事情。
出现的问题是当用户在多个组中时(通常是这种情况)。这就是我目前所拥有的:
UPDATE
user_groups_tbl
SET
sequence = sequence - 1
WHERE
group_id IN (SELECT group_id FROM user_groups_tbl WHERE user_id = #URL.user_id#)
AND
sequence > (SELECT sequence FROM user_groups_tbl WHERE user_id = #URL.user_id#);
我可以通过这个查询判断出序列的WHERE是不对的;这将拉出一些“随机”序列号,而不是特别是与正确的group_id
绑定到记录的序号。
我不知道我是否已经足够好地解释了这一点,希望有人能够看到我在这里尝试做什么...如果有人可以帮助查询,我将不胜感激。
目前正在MS SQL 2005服务器上运行,但最终将移植到MySQL引擎。
答案 0 :(得分:1)
我认为这会得到它:
UPDATE
user_groups_tbl
SET
sequence = sequence - 1
WHERE
group_id IN (SELECT group_id FROM user_groups_tbl
WHERE user_id = #URL.user_id#)
AND
sequence > (SELECT tbl2.sequence FROM user_groups_tbl tbl2
WHERE tbl2.user_id = #URL.user_id#
AND tbl2.group_id = user_groups_tbl.group_id);
我在where子句的后半部分添加了另一个条件来限制子查询将返回的Group_id。这需要添加表别名。