存储了序列的sql update表

时间:2011-10-05 20:28:00

标签: mysql sql sql-server-2005 sql-update sequences

我正在尝试使用以下结构更新数据库表:

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引擎。

1 个答案:

答案 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。这需要添加表别名。