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

标签 sql sqlite sorting

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

        name
        apple
        pear
        banana
        grape


用户想要按名称对这些水果进行排序,我们将毫不奇怪

         apple
         banana
         grape
         pear


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

         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语句。有什么想法或选择吗?

最佳答案

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

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语句。)
跟踪应用程序中的更改,并仅更新更改的行和必须由更改“碰撞”的行。 (简朴,但容易出错。)
不要让用户强加自己的排序顺序。 (通常,这个主意听起来并不差。)

关于sql - 考虑用户偏好来处理排序结果-数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434996/

相关文章:

sql - SQL 请求中缺少行,其中计数为 0(按值范围分组)

java - 如何在优先级队列中实现正确的排序算法?

python - 按第一个元素 float 对包含字符串的元组列表进行排序 (Python)

mysql - 使用选择查询更新添加 NULL 行

mysql - 如何在具有多个值的不同数据库中的两个表/不同列之间移动数据

sql - 如何在函数的 UPDATE 或 SELECT 语句中使用动态列名?

python - 带有批量插入的 peewee 进入 sqlite db 非常慢

mysql - 如何使用 MySQL Group_concat

node.js - 如何使用sequelize重置autoIncrement主键?

java - Java中未知类型的排序列表