当前位置:编程学习 > JAVA >>

Hibernate问题!请有开发经验的朋友进!

hibernate(HQL)中如何实现对一个字符串字段内容进行分割?

如:表中有一个varchar字段,其中一条记录内容:34,23,12,342,23,212,432,34,343,434,3,2,3,4,12,312,3,12,31212,23,23,12,23,21,27,45,34,23

假如我想查出这个字段所有记录中第3个逗号的那个整数(12)之和(与其它记录相加中的第3个逗号对应数相加),或者第N个逗号的那个整数之和,请问有没有Hibernate自带函数可以解决?或者调用数据库(MySQL)本地函数解决?

业务是这样的:我现在在做一个类似彩票的游戏,这个游戏中玩家可以对 0 - 27 这28个数进行投注,程序会一期一期(期号)随机出现 0 - 27 中任意一个数,程序就需要记录下每个玩家每期的对这 0 - 27 每个数的投注情况,还需要计算赔率(如对“3”这个数投注,那就要把所有玩家对所有数字投注的总和除以所有玩家在“3”这个数字上投注的总和),我的解决方案是把单个玩家对这28个数投注情况做成一个由“,”分割的字段,如果对找出所有玩家在“3”这个数字上投注的总和,就必须分割出第 3 个逗号前面的那个投注数,否则我就要对投注表做31个字段,28个字段记录对这个数的投注情况,1个主键字段,1个期号字段,1个用户ID字段。

请HQL高手解决一下。 --------------------编程问答-------------------- 可以写存储过程,substring(str,1,2)按下标取出数字,作为临时表字段(用子查询做为临时表也可以),然后 sum或count 一下该字段;要不切成数组计算;要不在Java代码中计算也行 --------------------编程问答-------------------- java肯定不行,上千个用户使用List性能低,我想在Hibernate中完全解决。

如果要是存储过程的话,Hibernate没有多大意义了。 --------------------编程问答-------------------- 要么是写存储过程在数据库中 截取和操作后返回
要么查询出来 在java中进行遍历操作 
个人觉得放在数据库方 会好些 --------------------编程问答-------------------- 你的表直接设计成
主键
期号
投注数

不就好咯? --------------------编程问答--------------------
引用 2 楼 hswzyx 的回复:
java肯定不行,上千个用户使用List性能低,我想在Hibernate中完全解决。

如果要是存储过程的话,Hibernate没有多大意义了。


存储过程这个我知道,但是已经使用了Hibernate封装,我还是希望尽量避免
存储过程。

--------------------编程问答--------------------
引用 3 楼 zn85600301 的回复:
要么是写存储过程在数据库中 截取和操作后返回
要么查询出来 在java中进行遍历操作 
个人觉得放在数据库方 会好些


呵呵,你仔细读一下我的业务需求。 --------------------编程问答-------------------- select SUM(SUBSTRING(column ,len))from table;

应该可以吧? --------------------编程问答-------------------- 呃SUBSTRING()少写个参数...要在column后面加个起始位置. --------------------编程问答--------------------
引用 7 楼 q412086027 的回复:
select SUM(SUBSTRING(column ,len))from table;

应该可以吧?


呵呵,你再认真读一下我的业务需求,len这个长度你是没办法确定的。 --------------------编程问答-------------------- 你这业务明显不关心单个玩家的情况,那么抛弃单个玩家的情况不考虑。
设计表:id,期数,投注总算,投注号。这样每有一个玩家对该号投注,则将该期该投资号的投注总算+1.
那么这表每期就有27条记录。记录相关的信息。这样。你想怎么算都行了。这是考虑总的情况。
如果你要兼顾个人。那么再加个个人情况表。专门记录个人在该期的情况。你想怎么处理都行了。 --------------------编程问答-------------------- 34,23,12,342,23,212,432,34,343,434,3,2,3,4,12,312,3,12,31212,23,23,12,23,21,27,45,34,23  只要将这串字符给标准化就能确定了呗. --------------------编程问答--------------------
引用 10 楼 ren008598 的回复:
你这业务明显不关心单个玩家的情况,那么抛弃单个玩家的情况不考虑。
设计表:id,期数,投注总算,投注号。这样每有一个玩家对该号投注,则将该期该投资号的投注总算+1.
那么这表每期就有27条记录。记录相关的信息。这样。你想怎么算都行了。这是考虑总的情况。
如果你要兼顾个人。那么再加个个人情况表。专门记录个人在该期的情况。你想怎么处理都行了。


嗯,不错,考虑的挺好,这个办法我想过了,但是这个彩票是每3分钟开一次,用户可能上千。要是这样的话,一年下来记录量可不少的。

我这业务是关心单个玩家情况的。数据库应记录下每个玩家在每期的投注情况!
投注总数不是+1,玩家对0-27这28个数可以投N个点,几位不能确定的。 --------------------编程问答--------------------
引用 11 楼 q412086027 的回复:
34,23,12,342,23,212,432,34,343,434,3,2,3,4,12,312,3,12,31212,23,23,12,23,21,27,45,34,23  只要将这串字符给标准化就能确定了呗.


你说的标准化是什么意思。这28个整数分别用“,”隔开,带表单个用户对0-27这28个数每个数投的点数。 --------------------编程问答-------------------- 直接使用本地查询,createSQLQuery() --------------------编程问答-------------------- 34,23,12,342,23,212,432,34,343,434,3,2,3,4,12   这串字符 , 号之间的长度不是不确定么,    那我就将这些字符给制定一个标准

000034,000023,000012,000342,......  这样子不就可以把他们的长度给确定下来了么. --------------------编程问答--------------------
引用 14 楼 assdust110 的回复:
直接使用本地查询,createSQLQuery()


没这么简单,请好好看看业务需求! --------------------编程问答--------------------
引用 15 楼 q412086027 的回复:
34,23,12,342,23,212,432,34,343,434,3,2,3,4,12   这串字符 , 号之间的长度不是不确定么,    那我就将这些字符给制定一个标准

000034,000023,000012,000342,......  这样子不就可以把他们的长度给确定下来了么.


嗯,这方法不错,但是,在用户表中的点数字段我设置的是bigint型,谁也说不好以后用户的点数能存多少,如果要是标准化,每个注长度*28+27,那这个注长度要设多少为标准化呢,这个彩注字段是varchar类型的,会不会有超出的情况呢? --------------------编程问答--------------------
引用 16 楼 hswzyx 的回复:
引用 14 楼 assdust110 的回复:

直接使用本地查询,createSQLQuery()


没这么简单,请好好看看业务需求!

头一次看见问个问题问得这么嚣张的,爷不伺候,自己玩去 --------------------编程问答--------------------
引用 18 楼 assdust110 的回复:
引用 16 楼 hswzyx 的回复:
引用 14 楼 assdust110 的回复:

直接使用本地查询,createSQLQuery()


没这么简单,请好好看看业务需求!

头一次看见问个问题问得这么嚣张的,爷不伺候,自己玩去


呵呵,小朋友,这个问题你说的太简单了,注意审题啊。如果要是不会的话,我结帖的时候把答案贴出来,你也可以学习一下。 --------------------编程问答-------------------- 业务都解释都不是很清楚, 应该列出几个例子, 看的人还得花长时间理解问题. 并且很拽的 --------------------编程问答--------------------
引用 20 楼 yewen0125 的回复:
业务都解释都不是很清楚, 应该列出几个例子, 看的人还得花长时间理解问题. 并且很拽的


如果不清楚q412086027就不会回我贴了,你们再好好看看业务需求,把心踏实下来看啊。别毛躁,慢慢看看。可能刚做程序的人是这样的,一看到复杂的业务需求就容易看不下来。还是解决问题来的实际,说别的没有用啊。 --------------------编程问答-------------------- 学习,关注~ --------------------编程问答--------------------
引用 19 楼 hswzyx 的回复:
引用 18 楼 assdust110 的回复:

引用 16 楼 hswzyx 的回复:
引用 14 楼 assdust110 的回复:

直接使用本地查询,createSQLQuery()


没这么简单,请好好看看业务需求!

头一次看见问个问题问得这么嚣张的,爷不伺候,自己玩去


呵呵,小朋友,这个问题你说的太简单了,注意审题啊。如果要是不会的话,我结帖的时候把答……


笑而不语,问问题,谦虚别人才会回答你  明白?

另外我需要学习你的什么?把表设计得乱七八糟然后求教吗? --------------------编程问答-------------------- 等着高手解决吧..... --------------------编程问答-------------------- 觉得表结构设计不合理,而且hibernate本身设计就不太容易写一些比较复杂的sql。
建议修改表结构,主键,期号,用户id,所选号码,投注钱数
虽然数据量会很大,但是你3分钟开一次,按照你原来的表结构数据量也小不了 --------------------编程问答-------------------- SUBSTRING_INDEX(`字段`,'分隔符','index')

其中index表示你想要的数据,例如3,取到12 --------------------编程问答-------------------- --------------------编程问答-------------------- 用存储过程来做,循环、SUBSTR()、INSTR()就可以做出来了 --------------------编程问答--------------------
引用 23 楼 assdust110 的回复:
引用 19 楼 hswzyx 的回复:
引用 18 楼 assdust110 的回复:

引用 16 楼 hswzyx 的回复:
引用 14 楼 assdust110 的回复:

直接使用本地查询,createSQLQuery()


没这么简单,请好好看看业务需求!

头一次看见问个问题问得这么嚣张的,爷不伺候,自己玩去


呵呵,小朋友,这个问题你说的太简单了,注……


你学不学习我不太关心,我现在关心的是这个问题有没有解决方法,我希望看到更多的回帖是解决问题的方法,“爷不伺候,自己玩去”你这话比我谦虚多了。这里都是发表问题、解决问题的,不是来嚣张的,呵呵,希望下次我看到的是你的答案不是这些和帖子内容没关系的话,如果要是路过,欢迎进来看看其他朋友的回复。你不明白业务需求,可是有很多朋友都已经在理解需求了,你可以看看他们的发表,q412086027已经给出不错的解决方案了。 --------------------编程问答--------------------
引用 25 楼 oklinsong 的回复:
觉得表结构设计不合理,而且hibernate本身设计就不太容易写一些比较复杂的sql。
建议修改表结构,主键,期号,用户id,所选号码,投注钱数
虽然数据量会很大,但是你3分钟开一次,按照你原来的表结构数据量也小不了


嗯,这个表结构是可以修改,但是我现在做的这个是“幸运28”的游戏,后面还有个叫做“生肖乐”的游戏,数字范围在1-49,而且也是3分钟开一次奖,不能排除第个玩家昼夜玩这个游戏,因为有托管模式,即使玩家不在线,只要设定模式也能自动投注。 --------------------编程问答-------------------- 糟糕的数据库设计造就了你这个需求 --------------------编程问答-------------------- VC 可以好做吧
--------------------编程问答-------------------- 这个使用hql怕是有难度,可以在mysql中自定义一个split函数得到指定位置的分隔字串并把它转为数字并用sum函数进行统计,具体可以参照这篇文章:http://apps.hi.baidu.com/share/detail/16244647 --------------------编程问答--------------------
引用 31 楼 sunny_kaka 的回复:
糟糕的数据库设计造就了你这个需求


哦,看来你已经把我的需求理解的很明白了,没关系,你有好的设计也可以说一下,我在这里发帖也是看看大家有没有好的意见,可以把你“高明”的设计发出来。 --------------------编程问答--------------------
引用 32 楼 gjhhn 的回复:
VC 可以好做吧


这个是Hibernate封装的数库访问。 --------------------编程问答--------------------
引用 33 楼 new_bird_0001 的回复:
这个使用hql怕是有难度,可以在mysql中自定义一个split函数得到指定位置的分隔字串并把它转为数字并用sum函数进行统计,具体可以参照这篇文章:http://apps.hi.baidu.com/share/detail/16244647


非常感谢,但是我既然用了HQL,就不希望在数据库里写一些自定义函数和存储过程了,这些我之前也考虑过了。 --------------------编程问答-------------------- 路过,看看 --------------------编程问答-------------------- --------------------编程问答-------------------- 这个本事我的学学! --------------------编程问答-------------------- --------------------编程问答--------------------

---------楼主资料---------
登录名:hswzyx
总技术分:87
总技术排名:121234
---------结贴情况---------
截至:2010-12-07 04:28:26
总发帖:5个
正常结贴:0个
未结贴:2个
结贴率:60.00%
评语:楼主,说真的你的结贴率不高哇!
-------------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 可以写存储过程,substring(str,1,2)按下标取出数字,作为临时表字段(用子查询做为临时表也可以),然后 sum或count 一下该字段;要不切成数组计算;要不在Java代码中计算也行 --------------------编程问答-------------------- 话说看了许久,看明白需求了。你就是想找到指定的位置的数字之和,是吧?但是据我所知(也可能是我开发经验少),还是没有见过hibernate有那么类似的函数的。。只能找另外的方法,再帮楼主想想,想不出的别见怪 --------------------编程问答-------------------- 与其在查询的时候浪费时间 不如再加个字段 直接在保存的时候就把要查询的分割好的东西存进去  然后直接查询新加的字段就OK了 --------------------编程问答-------------------- --------------------编程问答-------------------- 取出第三个数:substring_index(substring_index(name, ',', 3),',',-1)
其他的lz应该能搞定吧 --------------------编程问答--------------------
引用 41 楼 jie8991 的回复:
---------楼主资料---------
登录名:hswzyx
总技术分:87
总技术排名:121234
---------结贴情况---------
截至:2010-12-07 04:28:26
总发帖:5个
正常结贴:0个
未结贴:2个
结贴率:60.00%
评语:楼主,说真的你的结贴率不高哇!
--------------------------


谢谢,你要是能解决这问题我不就结了吗。 --------------------编程问答--------------------
引用 43 楼 lmc158 的回复:
可以写存储过程,substring(str,1,2)按下标取出数字,作为临时表字段(用子查询做为临时表也可以),然后 sum或count 一下该字段;要不切成数组计算;要不在Java代码中计算也行


Hibernate既然封装了数据库访问,写存储过程还是比较不妥的,我希望还是尽量在HQL中完成。 --------------------编程问答--------------------
引用 44 楼 jiaqiangm 的回复:
话说看了许久,看明白需求了。你就是想找到指定的位置的数字之和,是吧?但是据我所知(也可能是我开发经验少),还是没有见过hibernate有那么类似的函数的。。只能找另外的方法,再帮楼主想想,想不出的别见怪


嗯,谢谢,26楼那个朋友的方法可以试试,SUBSTRING_INDEX(`字段`,'分隔符','index'),大家共勉。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 51 楼 jinchan123 的回复:
标题:急聘 网络兼职人员,100元/天!工资日结
标题:急聘 兼职网络信息回复员(若干名)100元/天 工资日结
--------------------------------------《宣传内容》---------------------------------------
招聘人数: 若干名  薪资待遇: 工作每天3-5小时,100元/天工资每日支付;
岗位描述: 负责公司所要求……


这是什么,广告?请回复解决方案,这里都是学习的朋友。

别发这些没有用的信息。 --------------------编程问答--------------------
引用 45 楼 wanghualeilei 的回复:
与其在查询的时候浪费时间 不如再加个字段 直接在保存的时候就把要查询的分割好的东西存进去  然后直接查询新加的字段就OK了


后期这个玩家还可能再次对这一期的彩票游戏进行多次投注,现在的设计,能满足再次投注进行修改(与上次投注数相加)。 --------------------编程问答-------------------- 很好很强大 --------------------编程问答-------------------- 很好很强大 --------------------编程问答-------------------- 啥时候我也能学到这忠诚度啊  还需努力 啊 --------------------编程问答-------------------- 规范化,可以考虑为读取出的记录分切称多条记录,每条记录中的号码字符串的长度要一致,根据输入的第几期读取
--------------------编程问答--------------------
引用 59 楼 justdoit_notlast 的回复:
规范化,可以考虑为读取出的记录分切称多条记录,每条记录中的号码字符串的长度要一致,根据输入的第几期读取


那这种方法需要在java中实现,估计性能会降低很多,如果能在MySQL中直接筛出来的话最好。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 60 楼 hswzyx 的回复:
引用 59 楼 justdoit_notlast 的回复:

规范化,可以考虑为读取出的记录分切称多条记录,每条记录中的号码字符串的长度要一致,根据输入的第几期读取


那这种方法需要在java中实现,估计性能会降低很多,如果能在MySQL中直接筛出来的话最好。
如果记录长,我倒觉得会快很多! --------------------编程问答-------------------- --------------------编程问答-------------------- HQL和SQL差不多一样的,HQL也可以用SQL中的函数!想分割,Spilt还是可以的! --------------------编程问答-------------------- lz的表设计有问题,字符串截来截去非常耗cpu和内存,做出来也没法玩啊,当然你说要28个字段的那个设计也有问题。
你看这样设计表行不行1个主键字段,1个期号字段,1个用户ID字段,1个投注值字段(就是你在投注字段数字上投了多少),1个投注数字(只能是0-27)
现在要求某个投注数字的和只要select sum(投注值字段) from table1 group by 投注数字

建议lz看看数据库原理,讲三个范式的那段
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 64 楼 justdoit_notlast 的回复:
引用 60 楼 hswzyx 的回复:

引用 59 楼 justdoit_notlast 的回复:

规范化,可以考虑为读取出的记录分切称多条记录,每条记录中的号码字符串的长度要一致,根据输入的第几期读取


那这种方法需要在java中实现,估计性能会降低很多,如果能在MySQL中直接筛出来的话最好。
如果记录长,我倒觉得会快很多!


不会的,所有工作都交给java做,性能肯定会降低。比如其中有个业务是取得中奖人数(比如中奖结果是3,就要将对当前期号投注的所有用户的投注记录中第3个逗号前的那个数不为零的提取出来),同时还要计算赔率(中奖结果同上,就要将对当前期号投注的所有用户的投注记录中第3个逗号前的不为零的数进行相加除以奖池的总数),这两个业务是在一起的。 --------------------编程问答--------------------
引用 66 楼 xieyingan 的回复:
HQL和SQL差不多一样的,HQL也可以用SQL中的函数!想分割,Spilt还是可以的!


呵呵,那也是自定义函数,还是希望尽量在HQL语句中实现。 --------------------编程问答--------------------
引用 67 楼 super_marshal 的回复:
lz的表设计有问题,字符串截来截去非常耗cpu和内存,做出来也没法玩啊,当然你说要28个字段的那个设计也有问题。
你看这样设计表行不行1个主键字段,1个期号字段,1个用户ID字段,1个投注值字段(就是你在投注字段数字上投了多少),1个投注数字(只能是0-27)
现在要求某个投注数字的和只要select sum(投注值字段) from table1 group by 投注数字

建议lz看……


你说的很好,但是不可行。

首先,写一个投注数字是不行的,因为每个投注数字要对应这个用户投注多少点数,通过这些点数计算赔率。还有就是因为彩注每期间隔3分钟,用户可达万人,一天就会出许多的记录,绝不能排除每个用户昼夜玩这个游戏,因为有托管模式,用户离线,也能自动投注。 --------------------编程问答-------------------- 什么表设计成这个样子。。。。。 --------------------编程问答-------------------- 我先查查资料再告诉你啊。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------  良好数据库的设计,才是减轻麻烦的最直接方式 --------------------编程问答-------------------- 感觉HQL做出这种东西来很困难啊。。楼主还是考虑考虑其他办法吧 --------------------编程问答--------------------
引用 72 楼 fxtt1040 的回复:
什么表设计成这个样子。。。。。


你可以认真看看业务提出一个更好的设计方法。 --------------------编程问答--------------------
引用 76 楼 a13872321228 的回复:
 良好数据库的设计,才是减轻麻烦的最直接方式


说的是不错,看来你有良好的设计方法? --------------------编程问答--------------------
引用 77 楼 dreammyboy 的回复:
感觉HQL做出这种东西来很困难啊。。楼主还是考虑考虑其他办法吧


嗯,是,HQL不能提供更灵活的函数,我再考虑一下,如果要是把投注分成28个字段,这样会不会好一些,各位有什么意见吗? --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 82 楼 fyzxccom 的回复:
纸箱厂友情链接交换珠海纸箱厂 中山纸箱厂 坦洲纸箱厂


禁止不良信息。 --------------------编程问答-------------------- 冒泡.... --------------------编程问答-------------------- 发放蛋糕的风格大方过的风格大方过 --------------------编程问答-------------------- 特让他放打听个蛋糕房的风格大方过 --------------------编程问答-------------------- 高的风格的风格大方的风格大方过 --------------------编程问答--------------------
引用 87 楼 aqswe 的回复:
高的风格的风格大方的风格大方过


这是什么解决方案?????????? --------------------编程问答-------------------- 路过绑定
--------------------编程问答-------------------- 分成28个字段来解决是不错的办法,就是表结构不能重用麻烦一点。

我觉得楼主的思路偏了,想用查询语句实时统计总投注数。应该弄一张总投注数表,专门统计每期每个号码的总投注数。当用户提交一次投注记录的时候,就把总投注数表更新一下。这样就不用每次查询都去计算了。 --------------------编程问答--------------------
引用 90 楼 nicholas_lin 的回复:
分成28个字段来解决是不错的办法,就是表结构不能重用麻烦一点。

我觉得楼主的思路偏了,想用查询语句实时统计总投注数。应该弄一张总投注数表,专门统计每期每个号码的总投注数。当用户提交一次投注记录的时候,就把总投注数表更新一下。这样就不用每次查询都去计算了。


28个字段我会考虑,表结构不能重用确实是麻烦,后期还有个游戏“生肖乐”,这个游戏会产生45个数,是不是要产生45个字段?呵呵。

看来你还是没有理解业务需求。我把表结构给你列出来,你好好看看。

幸运28表:
    期号         开奖时间              开奖结果       奖池     状态
20101211076   2010-12-11 03:45:00        “”          0       0或1

状态0或1表示当前期号是未开奖和待开奖,大家不用关心。

假如有个用户标识为“2”,对20101211076投注,对“3”这个数投了10个点,对“6”这个数投了20个点。
假如有个用户标识为“3”,对20101211076投注,对“5”这个数投了50个点,对“10”这个数投了30个点。
假如有个用户标识为“4”,对20101211076投注,对“6”这个数投了10个点,对“20”这个数投了20个点。

幸运28投注表:
期号:20101211076
彩注:0,0,0,10,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
投注时间:2010-12-11 03:46:00
成员标识:2

期号:20101211076
彩注:0,0,0,0,0,50,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
投注时间:2010-12-11 03:47:00
成员标识:3

期号:20101211076
彩注:0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0
投注时间:2010-12-11 03:47:00
成员标识:4

那么这时幸运28表会更新奖池为145,本期用户投注的总投注数:
    期号           开奖时间               开奖结果       奖池     状态
20101211076   2010-12-11 03:45:00            ""          140      0或1

页面会列出 0 - 27 这28个数以及每个数对应的赔率供用户投注,当前赔率为:
赔率的计算是通过所有用户对某个数投注总数除以奖池的数,注意“6”这个数的赔率。

0 - 1:1
1 - 1:1
2 - 1:1
3 - 1:14    (“2”用户对“3”投了10个点,用奖池140除以10点就是赔率)
4 - 1:1
5 - 1:2.8    (“3”用户对“5”投了50个点,用奖池140除以50点就是赔率)
6 - 1:4.667    (“2”用户对“6”投了20个点,“4”用户对“6”投了10个点,用奖池140除以它们的和就是赔率)
7 - 1:1
8 - 1:1
9 - 1:1
10 - 1:4.667    (“3”用户对“5”投了30个点,用奖池140除以30点就是赔率)
11 - 1:1
12 - 1:1
13 - 1:1
14 - 1:1
15 - 1:1
16 - 1:1
17 - 1:1
18 - 1:1
19 - 1:1
20 - 1:7    (“4”用户对“20”投了20个点,用奖池140除以20点就是赔率)
21 - 1:1
22 - 1:1
23 - 1:1
24 - 1:1
25 - 1:1
26 - 1:1
27 - 1:1

开奖结果为:1+3+2=6     后台程序随机3个数,相加后得的数即为开奖结果。

6为开奖结果,开奖算点数公式为:  奖池总数 * 赔率 * 用户对“6”数字投注数 即为用户所得点数。

“2”和“4”用户都对“6”这个数字进行了投注,所以他们都为中奖者。按照公式他们中奖点数所得为:

“2”用户:140 * 4.667 * 20
“4”用户:140 * 4.667 * 10

我问题就出在这一步,前台显示赔率,我可以全部查询进行计算,但是后台由于在开奖的时候要即时设定新奖,计算用户中奖点数,奖期状态修改等等操作,还有其它很多业务,要在后台快速度完成多个业务,这时候就有性能问题了,我希望在计算中奖点数的时候,直接筛出来对“6”这个数投注不为0的用户列表。

而且开奖之后,记录不删除,用户登录后还可查看之前中奖点数,这时候还需要筛出来对“6”这个数投注不为0的记录进行计算供用户查看。

所以这个分割字符串我认为还是有必要解决一下的。 --------------------编程问答-------------------- 请大家参看91楼的详细例子,觉得我设计、思路有问题,请回复一些真正的高性能解决方案,供其它朋友学习参考。 --------------------编程问答-------------------- 仔细看了一下你方案,你的数据库表设计肯定是有问题的,首先,你用带“,”号的字符串来存用户的投注,数据冗余比较大,因为用户不可能每个数都投注,你里面的“,”号和0完全是增加了数据库的存储量,第二就是采用字符串运算来检索数据库不可能使用索引,必然得全库扫描每一条记录,检索效率极低,随着数据量的增大,用户等待时间将大幅增加,从而失去了程序的可操作性。建议还是设计成几个表要好:开奖表(id,期号,开奖类型,开奖时间,开奖状态,中奖号码)、投注表(id,开奖id,玩家id,投注号码,投注点数)、玩家表(id,登陆名,口令......),这样做统计是很简单的,在投注表建立了索引的情况下,数据库检索的时间可以节省很多(与索引树的深度有关),至于你考虑的记录数量的问题,如果觉得量大,可以考虑采用oracle、db2等大型数据库,只要优化调整得好,完全可以轻松支撑下来。 --------------------编程问答-------------------- 看了一下你的需求,现在假设你的字段名为column1

select SUM(SUBSTRING_INDEX(SUBSTRING_INDEX(column1,',',3),','-1)) from table

其中

SUBSTRING_INDEX(column1,',',3)

取得结果 34,23,12

SUBSTRING_INDEX(SUBSTRING_INDEX(column1,',',3),','-1)

取得结果 12
然后经过 sum 这个函数就可以计算了。
如果还有其它凝问可以加我qq,现在也是正在开发跟楼主相类似的软件。qq :402279001
--------------------编程问答-------------------- 觉得你表设计的的确有问题, 93楼已经给了解法了, 就不多说
另外如果你真的很在意计算赔率的效率的话, 根本就不需要从数据库里取数据, 建立一个数组, 当每一个彩注被投注的时候, 将彩注对应的元素自增, 向下面这样
static int[] xx = new int[28]
比如当彩注3被投注的时候 xx[3]++
然后赔率  = xx[3]/sum(xx) --------------------编程问答--------------------
引用 95 楼 dengyu841031 的回复:
觉得你表设计的的确有问题, 93楼已经给了解法了, 就不多说
另外如果你真的很在意计算赔率的效率的话, 根本就不需要从数据库里取数据, 建立一个数组, 当每一个彩注被投注的时候, 将彩注对应的元素自增, 向下面这样
static int[] xx = new int[28]
比如当彩注3被投注的时候 xx[3]++
然后赔率  = xx[3]/sum(xx)

红的那行改下:比如当彩注3被投注为33的时候 xx[3] = xx[3] + 33 --------------------编程问答--------------------
引用 93 楼 new_bird_0001 的回复:
仔细看了一下你方案,你的数据库表设计肯定是有问题的,首先,你用带“,”号的字符串来存用户的投注,数据冗余比较大,因为用户不可能每个数都投注,你里面的“,”号和0完全是增加了数据库的存储量,第二就是采用字符串运算来检索数据库不可能使用索引,必然得全库扫描每一条记录,检索效率极低,随着数据量的增大,用户等待时间将大幅增加,从而失去了程序的可操作性。建议还是设计成几个表要好:开奖表(id,期号,开奖类……


谢谢,很感谢。说的非常好。

这个游戏不能排除每个用户对每个数字的投注,我之前写那么多的“0,”,就是为了让大家容易看清对哪个数进行了投注。绝不能排除这样的投注:34,23,12,342,23,212,432,34,343,434,3,2,3,4,12,312,3,12,31212,23,23,12,23,21,27,45,34,23
而且是经常性的,因为这个网站的客户给过我一个参考网站,我看了一下,确实是这样的,很多用户对每个数字进行投注。而且有几种投注方式:全押、押大、押小、押中、押边等,都是对多个数进行投注的。而且后面的“生肖乐”游戏会产生45个数字的投注。这个网站就算有100个用户,每3分钟就可能产生4500条记录。

数据库客户那边有要求是MySQL的。

检索这部分是要先筛出“期号”、再“找出对应数字的投注数”,如果要是索引的话,也是对期号索引吧?用对投注字段进行索引吗? --------------------编程问答--------------------
引用 94 楼 yousteely 的回复:
看了一下你的需求,现在假设你的字段名为column1
SQL code

select SUM(SUBSTRING_INDEX(SUBSTRING_INDEX(column1,',',3),','-1)) from table


其中
SQL code

SUBSTRING_INDEX(column1,',',3)


取得结果 34,23,12
SQL code

SUBST……



不错,和captainblue说的一样。但是这个函数是不是需要在Hibernate注册一下。Hibernate应该不支持这个函数吧。我看Hibernate注册函数的源代码里没有这个函数。 --------------------编程问答--------------------
引用 96 楼 dengyu841031 的回复:
引用 95 楼 dengyu841031 的回复:

觉得你表设计的的确有问题, 93楼已经给了解法了, 就不多说
另外如果你真的很在意计算赔率的效率的话, 根本就不需要从数据库里取数据, 建立一个数组, 当每一个彩注被投注的时候, 将彩注对应的元素自增, 向下面这样
static int[] xx = new int[28]
比如当彩注3被投注的时候 xx[3]++
然后赔率  =……


呵呵,我要是在开奖时计算赔率就不用开辟数组了,直接声明变量,累计“3”对应点数就可以了。关键现在“3”这个数字对应的点数我怎么取出来是问题。91楼倒数第三段话就描述了这个业务。 --------------------编程问答-------------------- 我们正在学呢,过来学习一下,也是好嘚。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,