2012-04-29 69 views
0

我有一个基于Place(P)和Racers的数量(R) 和points_id指示的评分格式的查找得分点的表格。表中显示了两种情况。 有些时候,这些点直接由P和N的值确定,其他时间点最容易通过pts_calc列中显示的简单计算确定。基于db列中的数据进行计算的MYSQL函数

|points_id| P | N |points|pts_calc|  
| 1 | 0 | 0 | NULL | pin | 
| 1 |DNS| 0 | NULL | nin+1 | 
| 3 | 1 | 0 |102.00| NULL | 
| 3 | 2 | 0 | 98.00| NULL | 
| 3 | 3 | 0 | 96.00| NULL | 
| 3 | 4 | 0 | 93.00| NULL | 
| 3 | 5 | 0 | 91.00| NULL | 
| 3 | 6 | 0 | 89.00| NULL | 
| 3 |DNF| 0 | 85.00| NULL | 

我希望能够创建一个函数,返回三个输入变量的点。 points_id,P,N 下面是我试过的。

CREATE FUNCTION POINTS(pid INT,pin VARCHAR(3),nin INT) 
RETURNS DEC(6,2) 
DETERMINISTIC 

BEGIN 
DECLARE pts DECIMAL(6,2); 
DECLARE pcalc VARCHAR(20); 

SELECT points,pts_calc INTO pts,pcalc FROM scoring_points WHERE points_id=pid AND (P=pin OR P='0') AND (N=nin or N=0); 

IF(pts IS NULL) THEN 
SET @s= CONCAT('SET pts = ',pcalc); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 

END IF; 

RETURN pts; 

END 

但我得到了这个错误。

1336 - 动态SQL没有包括在存储函数或触发允许

进一步的研究显示准备语句未功能,但只允许程序。 我当时希望能做点像;

SELECT SUM(Points(pid,place,numb)) FROM t1 GROUP BY racer.id 

但到计划B(待定),除非有人有好主意。

+0

退一步说,怎么做这个组件摆脱points列适合你的应用程序?你的数据结构让我觉得很奇怪。 – eggyal 2012-04-29 14:59:25

+0

不够公平,看起来很奇怪,但有两个原因,其中一个评分系统是非常不同的,另外两个缺少情况二,其中有不同的P和N组合的不同点值。例如,如果你在一组10个车手中得到100分,那么当你在两个车手当中只有一个时,你只能得到75分。这就是驱动数据结构的原因。计算事物是在存在数学关系时不必为案件复制许多行。 – davewhirlwind 2012-04-29 15:37:12

回答

0

我想你可能有良好表现有三个数字列,而不是你pts_calc柱:

  1. cPIN - 系数pin长期
  2. cNIN - nin项的系数
  3. cnst - 常数项

您的功能可以执行:根据您的需求

SELECT IFNULL(points, cPIN*pin + cNIN*nin + cnst) INTO pts 
FROM scoring_points 
WHERE ... 

,你甚至可以通过只使用cnst,留下其他两个等于0

+0

得出的结论是相同的,但并不灵活,但应该快速完成工作。谢谢戴夫 – davewhirlwind 2012-04-29 16:24:56