我正在创建一个选美比赛评分系统使用PHP和MySQL或PhpMyAdmin在XAMMP。不知何故,我用MySQL获得了候选人的排名,但也有一些案例可以获得联系。如何使用PHP打破查询结果的束缚?
候选人的排名是根据他们在有5名评委和9名候选人的类别中的得分来确定的。所以我真的不知道该怎么做,也不知道如何用PHP解决它。
如果我想让C9而不是C4排在第一位,该怎么办?
这是我的数据库...希望有人能帮我。提前谢谢。
CREATE TABLE IF NOT EXISTS score (
candidate_no varchar(5) NOT NULL ,
category_no varchar(5) NOT NULL ,
judge_id varchar(5) NOT NULL ,
score int(3),
PRIMARY KEY (candidate_no,category_no,judge_id),
KEY score_fkey (judge_id),
KEY score_fkey3 (category_no)) ;
INSERT INTO score (candidate_no, category_no, judge_id, score) VALUES
('C1', 'cat1', 'J1', 17),
('C1', 'cat1', 'J2', 15),
('C1', 'cat1', 'J3', 17),
('C1', 'cat1', 'J4', 18),
('C1', 'cat1', 'J5', 19),
('C2', 'cat1', 'J1', 17 ),
('C2', 'cat1', 'J2', 15 ),
('C2', 'cat1', 'J3', 16 ),
('C2', 'cat1', 'J4', 18 ),
('C2', 'cat1', 'J5', 18 ),
('C3', 'cat1', 'J1', 15 ),
('C3', 'cat1', 'J2', 20 ),
('C3', 'cat1', 'J3', 19 ),
('C3', 'cat1', 'J4', 16 ),
('C3', 'cat1', 'J5', 19 ),
('C4', 'cat1', 'J1', 19 ),
('C4', 'cat1', 'J2', 20 ),
('C4', 'cat1', 'J3', 18 ),
('C4', 'cat1', 'J4', 18 ),
('C4', 'cat1', 'J5', 19 ),
('C5', 'cat1', 'J1', 18 ),
('C5', 'cat1', 'J2', 16 ),
('C5', 'cat1', 'J3', 18 ),
('C5', 'cat1', 'J4', 18 ),
('C5', 'cat1', 'J5', 18 ),
('C6', 'cat1', 'J1', 20 ),
('C6', 'cat1', 'J2', 16 ),
('C6', 'cat1', 'J3', 16 ),
('C6', 'cat1', 'J4', 16 ),
('C6', 'cat1', 'J5', 17 ),
('C7', 'cat1', 'J1', 11 ),
('C7', 'cat1', 'J2', 12 ),
('C7', 'cat1', 'J3', 14 ),
('C7', 'cat1', 'J4', 15 ),
('C7', 'cat1', 'J5', 17 ),
('C8', 'cat1', 'J1', 15 ),
('C8', 'cat1', 'J2', 16 ),
('C8', 'cat1', 'J3', 18 ),
('C8', 'cat1', 'J4', 17 ),
('C8', 'cat1', 'J5', 17 ),
('C9', 'cat1', 'J1', 19 ),
('C9', 'cat1', 'J2', 19 ),
('C9', 'cat1', 'J3', 19 ),
('C9', 'cat1', 'J4', 19 ),
('C9', 'cat1', 'J5', 18 );这是我的问题:
select sum
,candidate_no
,@curRank := @curRank + 1 AS rank
from(
select sum(score) / 5 sum
,candidate_no
from score
where candidate_no = 'c1'
union
select sum(score) / 5 sum
,candidate_no
from score
where candidate_no = 'c2'
union
select sum(score) / 5 sum
,candidate_no
from score
where candidate_no = 'c3'
union
select sum(score) / 5 sum
,candidate_no
from score
where candidate_no = 'c4'
union
select sum(score) / 5 sum
,candidate_no
from score
where candidate_no = 'c5'
union
select sum(score) / 5 sum
,candidate_no
from score
where candidate_no = 'c6'
union
select sum(score) / 5 sum
,candidate_no
from score
where candidate_no = 'c9'
) a , (SELECT @curRank := 0) r
order by sum desc结果将是..
sum | candidate_no | rank
18.8000 | C4 | 1
18.8000 | C9 | 2
17.8000 | C3 | 3
17.6000 | C5 | 4
17.2000 | C1 | 5
17.0000 | C6 | 6
16.8000 | C2 | 7
16.6000 | C8 | 8
13.8000 | C7 | 9发布于 2013-07-15 23:13:38
@JHaasie77有一个很好的方法,使用candidate_no作为排序器(然后归结为字母数字的排序顺序),当你使用降序时,首先做9。(同样,如果您使用升序,则C9将是最后一个)。如果没有更多的非限定符,那么这是最简单的路线。
如果您是基于另一个指标进行排序决策的,那么您可能希望更改您的表,以添加一些可以排序的其他列。(也许是“家乡英雄”对“访客”,也可能是年龄最小的人先结婚--谁知道呢。)但任何其他详细信息都需要添加到数据库中,以便您可以使用它在结果中创建首选项。
也就是说,您可以通过使用GROUP BY而不是union来精简查询。这也使它具有足够的动态性,如果将来有更多的候选者,查询将自动重新调整。因此,您的长查询现在变成:
SELECT sum
,candidate_no
,@curRank := @curRank + 1 AS rank
FROM (
SELECT SUM(score) / 5 SUM
,candidate_no
FROM SCORE
GROUP BY candidate_no
) a
, (
SELECT @curRank := 0
) r
ORDER BY sum DESC
,candidate_no DESC这基本上意味着对于每个唯一的candidate_num,它会将得分相加并除以5。上面还添加了candidate_num的第二个排序器,使C9出现在第一个as seen here。
发布于 2013-07-15 23:06:11
您可以添加第二个ORDER BY变量,这样,如果您希望它先按sum排序,然后candidate_no no,它就变成了"ORDER BY sum desc,candidate desc“。第二。
https://stackoverflow.com/questions/17657281
复制相似问题