我有一个包含未排序行的表,并希望通过列对它们进行排序。我希望表可以按列排序,因此我创建了一个sort_by列。
现在的表格如下:
ID Data sort_by
-- ----- -------
27 Blahh 1
54 Blahh 2
57 Blahh 3
1 Blahh 4
现在我想在第二个位置插入一行(sort_by = 2)。然后我将不得不为所有行更新sort_by> 2,sort_by + = 1.如果我有几百万行,那就是很多更新。
那么,有这样的规范方法吗?当然我可以在列之间有更大的步骤并在间隙等中插入新行,但是有一种美观的方式,即不是黑客?
排序由用户手动完成。 google for = upvote是一个很好的短语,我尝试的所有内容都会在某些DBMS或某个框架中对表进行排序。 :)
答案 0 :(得分:1)
没有人手动排序一百万行。这里有一个classic XY Problem。
你在问:
如何在SQL数据库中对一百万行进行排序?
当你应该问:
如何在传统关系数据库管理系统中管理的在线商店中推广某些产品?
前者需要一堆hacky解决方案,例如权重,或精度不断扩大的十进制列,或数据库链表。所有这些都容易出错,这是违反直觉的,并忽略了问题域。
你评论说:
考虑您想要在网上商店的起始页面上展示的产品 - 营销团队认为会销售的产品
那么,首页上我想要什么类型的产品?特色产品,正在销售的产品,新产品,即将缺货的产品......
-- Wacky featured items are random!
SELECT * FROM products WHERE featured = True ORDER BY RANDOM LIMIT 10;
-- More than 20% wow, thats a great deal!
SELECT * FROM products WHERE discount > 0.2 ORDER BY discount ASC LIMIT 10;
-- New stock, tell me about it!
SELECT * FROM products WHERE added_to_database < now()-24hours ORDER BY added_to_database LIMIT 10;
-- These items are about to disappear for ever, buy now!
SELECT * FROM products WHERE stock_number < 20 ORDER BY stock_number LIMIT 10;
想想你为什么要订购它们,而不是如何订购它们。通过这种方式,您可以根据某些标准获得一些标准,并且它可以更紧密地模拟您正在使用的域。
答案 1 :(得分:0)
我能想到的两种方式。
1)将sort_by更改为小数。您将始终[a]能够在现有值之间插入一个包含更多小数位的新行。
2)将sort_by
替换为comes_after_ID
,将表格转换为链接列表。这是指向YourTable.ID
的外键。
ID Data Comes_after_ID
-- ----- --------------
27 Blahh NULL
54 Blahh 27
57 Blahh 54
1 Blahh 57
使用第二种设计,在应用程序代码而不是SQL中进行排序会更容易。
无论哪种方式,拖放式GUI都可以向用户隐藏此实现。
[a]当然,Always(TM)仅限于系统上的小数分辨率。最终,您将不得不重新排序您的项目。但这可以作为月度工作而不是用户处理输入来完成。