MySQL中记录的自动排序

时间:2013-07-27 01:04:33

标签: mysql

我有一个MySQL表,其中包含属于公司和个人(客户)的电话号码。每个客户可以拥有多个电话号码,他们通常希望按特定顺序列出,因此该表有一个sequence字段,可根据客户的偏好对每个客户的电话号码进行排序。字段是:

  • parent_id - char
  • sequence - tinyint
  • area_code - 字符串
  • number - 字符串

主键是parent_idsequence的组合。

到目前为止一切顺利。当我想在订单中移动数字或删除数字时,会出现“问题”。

当移动一个数字时,我这样做(使用PHP)将该记录的sequence更改为0(客户的第一个电话号码通常为1,我只使用0),然后递增前面的数字sequence乘以1,然后将原始记录的sequence设置为比它少1。换句话说,将sequence与前面的电话号码交换,但需要三次查询。

删除电话号码时,我会删除该记录,然后我必须重新排序该客户的剩余电话号码,以便不会丢失sequence。这取决于客户拥有多少个电话号码,但可能是多个查询。

我想知道是否有更有效的方法。

提前致谢!

2 个答案:

答案 0 :(得分:1)

UPDATE可以同时影响多条记录;例如:

  1. 将序列#4移至#2:

    UPDATE my_table SET sequence = CASE
      WHEN sequence = 4 THEN 2
      WHEN sequence < 4 AND sequence >= 2 THEN sequence + 1
    END WHERE parent_id = ? AND sequence BETWEEN 2 AND 4;
    
  2. 删除序列#3

    DELETE FROM my_table WHERE parent_id = ? AND sequence = 3;
    
    UPDATE my_table
    SET    sequence = sequence - 1
    WHERE  parent_id = ? AND sequence > 3;
    
  3. 但是,如果(parent_id, sequence)以这种方式发生变化,您应该非常谨慎地使用sequence作为PK。定义一个完全合成的PK可能会更好。

答案 1 :(得分:1)

如何删除这样的内容:

DELETE FROM phone_numbers WHERE parent_id = '{$parentID}' AND sequence = '{$seq}'

UPDATE phone_numbers SET sequence = sequence + 1 WHERE parent_id = '{$parentID}' AND sequence < '{$seq}'