2011-04-24 45 views
0

我正在尝试写一些sql来根据职位分配一个值,并且每个职位都获得总数字变量的一定百分比。可能有位置关系。如果有联系,例如第4个位置有3个并列,则所有3个条目都会获得相同数量的第3,第4和第5个位置的总和。所以我需要计算这些纽带中每个位置的值,然后均匀分割。然后下一个位置将获得第六个位置并重复,直到达到最后位置。根据MySQL中的关系百分比颁发奖励

我已经有排名功能,我只需要整理值的分配。总分配有一个设定的金额,并且我有一个表格存储每个职位的所有值。我将如何在语法上实现这一点,最好是结合使用PHP和MySQL。非常感谢您的任何帮助。

+1

你能抽象出所有关于“奖品”和“支出”的东西吗?我们不知道您的应用程序中的含义,对于手头的问题可能并不重要。 – 2011-04-24 21:12:17

+0

它真的必须在SQL中吗?这对于SQL来说看起来相当复杂,但几乎可以用任何语言编程。 – Halcyon 2011-04-24 21:45:49

+0

非常感谢,迄今为止,我已经对它进行了一些改编,希望能够更好。我也将语言要求更改为偏好,但不是要求。 – 2011-04-25 01:45:44

回答

1

MySQL不会做窗口功能,所以这变得毛茸茸。

CREATE TABLE scores (score real); 
CREATE TABLE prizes (prize real); /* in any order but assumed distinct, minor changes otherwise */ 

CREATE VIEW ranked_scores AS 
SELECT s.score, 
    1+COUNT(s2.score > s.score) AS best_place, 
    -1+COUNT(s2.score=s.score) AS n_tied_with 
FROM score s JOIN score s2 ON s2.score>=s.score; 

/* if prizes can be the same we need something more like the view above */ 
CREATE VIEW ranked_prizes AS 
SELECT p.prize, COUNT(p2.prize) AS prize_rank 
FROM prize p JOIN prize p2 ON p.prize<=p2.prize; 

/* there are more efficient ways of getting those ranks except I don't know 
* MySQL syntax for getting a pseudo-table 1..n, and windowing functions 
* are not available IFAIK.*/ 

SELECT score, avg(prize) FROM ranked_scores JOIN ranked_prizes 
ON prize_rank between best_place and best_place+n_tied_with;