Don*_*ulo 11 mysql sql-order-by
这是一个无聊的问题,但是我从来没有得到过直接的回答.
假设我有一个包含以下字段和值的数据库表:
| id | date_added | balance |
+------------------------------------+
| 1 | 2009-12-01 19:43:22 | 1237.50 |
| 2 | 2010-01-12 03:19:54 | 473.00 |
| 3 | 2010-01-12 03:19:54 | 2131.20 |
| 4 | 2010-01-20 11:27:31 | 3238.10 |
| 5 | 2010-01-25 22:52:07 | 569.40 |
+------------------------------------+
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的"会计"子系统.我想获得最新的余额.该id
字段设置为auto_increment.通常,我会使用:
SELECT balance FROM my_table ORDER BY date_added DESC LIMIT 1;
但我需要确保返回的值是最新的...(参见上面的id#2和3)
1)我会更好地使用:
SELECT balance FROM my_table ORDER BY id DESC LIMIT 1;
2)或者这是一个更好的解决方案?:
SELECT balance FROM my_table ORDER BY date_added,id DESC LIMIT 1;
AFAIK,auto_increment
效果很好,但它是否足够可靠,可以对这个至关重要的东西进行排序?这就是为什么我认为按两个字段进行排序是一个更好的主意,但是当我在过去这样做时,我在MySQL中看到了一些非常古怪的行为.或者,如果有更好的解决方案,我将非常感谢您的意见.
提前致谢!
布赖恩
pax*_*blo 10
如果是一个机会,你会得到两个加有相同的日期,你可能需要:
SELECT balance FROM my_table ORDER BY date_added DESC,id DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
(注意两个字段的'descending'子句).
但是,您将需要你想在某人添加2的调整分录到发生什么事要考虑到次月的其中作出之日起31 日一月,以确保一月份就完成了.它的ID将大于2月1 日的ID .
通常,会计系统只适用于该日期.也许如果你能告诉我们为什么订单很重要,我们可以提出其他建议.
回应你的评论:
我很想听到你可能有的任何其他想法或建议,即使它们是偏离主题的,因为我对会计类型数据库模型一无所知.
我会提供一些建议 - 这是我能立刻想到的,我通常会用更少的鼓励来发出更多"建议":-)前两个,与会计相关的数据库相关更多,是:
首先,以第三范式执行所有操作,只有在遇到性能问题时才会恢复.这将为您节省大量的焦虑,重复数据可能会失去一步.即使您确实还原,也可以使用触发器和其他DBMS功能来确保数据不会失败.
例如,如果要加快对last_name列的搜索速度,可以创建upper_last_name列(已编制索引),然后使用该列查找与已经大写的搜索词匹配的记录.这几乎总是比每行功能更快upper(last_name)
.您可以使用插入/更新触发器来确保始终正确设置upper_last_name,这仅在名称更改时产生成本,而不是每次搜索时都会产生成本.
其次,除非您可以使用相同的触发器类型技巧来保证数据不会失步,否则不要跨表(例如当前架构)复制数据.当您向客户发送最终余额与起始余额加购买不匹配的发票时,您的客户会怎么做?这不会让你的公司看起来很专业:-)
第三(这与会计相关更多),您通常不需要担心动态计算余额时的交易数量.这是因为会计系统通常在年末具有翻转功能,这会重置期初余额.
因此,您通常不必一次处理超过一年的数据,除非您是美国政府或微软,否则不会那么费力.
归档时间: |
|
查看次数: |
16739 次 |
最近记录: |