考虑用户偏好 - 数据库来处理排序结果

时间:2011-06-22 04:44:52

标签: sql sqlite sorting

假设我们有一个包含以下数据的简单数据库:

        name
        apple
        pear
        banana
        grape

用户希望按名称对这些水果进行排序,我们将毫不奇怪地将其用于

         apple
         banana
         grape
         pear

但是,出于某种原因,用户希望将pear作为第3个水果,这意味着他希望:

         apple
         banana
         pear
         grape

而且,重要的是,用户希望在此后按名称对水果进行排序时保留此顺序。

我们该如何解决这个问题?在我的头脑中,我们可以添加一个字段user_sort_id,当用户对排序结果进行排序和操作时,它将被更新,我们将使用该字段作为排序键。

                       init value       -> sort by name         ->place pear as the seconds
        name           user_sort_id 
        apple            0                     0                          0
        pear             1                     3                          2  
        banana           2                     1                          1  
        grape            3                     2                          3 

这种方法应该在理论上起作用。但是,在实践中,我无法想到一个优雅而快速的SQL语句可以实现这一目标。任何想法或替代品?

1 个答案:

答案 0 :(得分:1)

如果您希望每个用户都有独立的排序顺序,则需要另一个表。

CREATE TABLE user_sort_order (
    name VARCHAR(?) NOT NULL REFERENCES your-other-table (name),
    user_id INTEGER NOT NULL REFERENCES users (user_id),
    sort_order INTEGER NOT NULL                -- Could be float or decimal
);

然后订购很容易。

SELECT name 
FROM user_sort_order
WHERE user_id = ?
ORDER BY sort_order

更新没有灵丹妙药。

  • 删除所有用户的行,并使用新订单插入行。 (蛮力永远有效。)
  • 使用新订单更新每一行。 (可能是很多UPDATE语句。)
  • 跟踪应用中的更改,并仅更新已更改的行以及必须由更改“碰撞”的行。 (Parsimonious,但容易出错。)
  • 不要让用户强加自己的排序顺序。 (通常不像听起来那么糟糕。)