使用 MySQL 的条件判断实现大小值判断
2010-11-15 10:28
676 查看
如果在 MySQL 中使用了 InnoDB 引擎,那么对于常规的 COUNT (id) 等操作非常耗费资源,速度比较慢,为了保持效率,需要将这些数据行的统计值保存起来,使用的时候直接查询获取就可以了。比如一个 BBS 系统中需要将每个论坛板块的主题数量和回复数量作为一个字段保存到相应的板块信息表中;如果主题和回复变动不频繁,那么对这个统计值的操作也不频繁,每次使用 COUNT (id) 重新查询还是可行的,但如果面对的是一个大型 BBS,不仅数据量巨大,而且用户数巨大引起主题和回复更新非常快,频繁的对巨量数据调用 COUNT (id) 查询,在性能上是不太现实的;所以,对于频繁更新的统计值,我们可以采用另外一种方法:直接加减。也就是说,如果增加了新主题,针对主题的统计值进行加一操作,反过来,删除主题,进行减一操作。
在 实际使用加减法更新统计值的时候,总有可能会发生统计值不正确的时候,特别是当统计值已经是零的时候如果再次减一,就会变成无法接受的错误:负值;如果你 将统计值字段定义了 unsigned,-1 会变成该字段的最大值(二进制取反引起的),也是无法接受的。这个时候,我们需要一个 SQL 函数,实现类似编程语言中 Max() 函数的功能,将这个统计值最小控制在 0。
在 PostgreSQL 中,有一个叫 greatest 的条件函数,可以让我们通过以下 SQL 语句避免统计值出现负值:
UPDATE dd_stml_stat SET stat_value=GREATEST(stat_value-1,0) WHERE stat_id=10;
可惜的是,在 MySQL 中并没有对应的函数,不过 MySQL 有一个叫 IF() 的特殊 Control Flow Function,可以使用它来实现我们的目标:
UPDATE dd_stml_stat SET stat_value=(IF(stat_value>1,stat_value-1,0)) WHERE stat_id=10;
其实这个 IF() 函数就是一个简单的判断器,它会判断第一个参数是否成立,如果是 True,就会返回第二个表达式的值,如果是 False,会返回第三个表达式的值;从而变相的在 MySQL 中实现了大小值比对函数。
http://www.360doc.com/content/07/0117/20/18220_334911.shtml
在 实际使用加减法更新统计值的时候,总有可能会发生统计值不正确的时候,特别是当统计值已经是零的时候如果再次减一,就会变成无法接受的错误:负值;如果你 将统计值字段定义了 unsigned,-1 会变成该字段的最大值(二进制取反引起的),也是无法接受的。这个时候,我们需要一个 SQL 函数,实现类似编程语言中 Max() 函数的功能,将这个统计值最小控制在 0。
在 PostgreSQL 中,有一个叫 greatest 的条件函数,可以让我们通过以下 SQL 语句避免统计值出现负值:
UPDATE dd_stml_stat SET stat_value=GREATEST(stat_value-1,0) WHERE stat_id=10;
可惜的是,在 MySQL 中并没有对应的函数,不过 MySQL 有一个叫 IF() 的特殊 Control Flow Function,可以使用它来实现我们的目标:
UPDATE dd_stml_stat SET stat_value=(IF(stat_value>1,stat_value-1,0)) WHERE stat_id=10;
其实这个 IF() 函数就是一个简单的判断器,它会判断第一个参数是否成立,如果是 True,就会返回第二个表达式的值,如果是 False,会返回第三个表达式的值;从而变相的在 MySQL 中实现了大小值比对函数。
http://www.360doc.com/content/07/0117/20/18220_334911.shtml
相关文章推荐
- 使用 MySQL 的条件判断实现大小值判断
- 使用SQL语句如何实现条件判断
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
- 合并有序链表,实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。
- 如何在JSP页面中使用JSTL标签实现if和if-else判断,判断条件使用<%=value%>
- 不使用乘除法,for,while,if,else,switch,case,条件判断语句(A?B:C) 实现:1+2+....+n
- MySQL中使用case when 语句实现多条件查询的方法
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。
- 实现1+2+3...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字(for、while、if、else、switch、case)。
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。
- MySql查询IF和CASE条件判断使用
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。Java实现
- 算法--实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。(详细讲解)
- 实现1+2+3+...+n。要求不能使用乘除法,for,while,if,else,switch,case,等关键字及条件判断语句。
- day01之合并两个有序链表+实现1+2+3...+n要求不能使用乘除法循环条件判断等
- MySQL中使用case when 语句实现多条件查询的方法
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
- 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字