如何使用PHP打破我的MySQL查询的关系?

时间:2013-07-15 14:56:49

标签: php mysql xampp

我正在XAMMP中使用PHP ang MySQL或PhpMyAdmin创建一个选美评分系统。我已经设法使用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

2 个答案:

答案 0 :(得分:0)

你可以添加第二个ORDER BY变量,如果你希望它首先按顺序排序,然后是候选号,它就变成“ORDER BY sum desc,candidate_no desc”。第二。

答案 1 :(得分:0)

@ JHaasie77有一个很好的方法,使用candidate_no作为订货人(然后归结为字母数字排序顺序),当你使用降序时首先制作9。 (同样,如果你使用升序,C9将是最后的)。如果没有进一步的取消资格,那么这是最简单的路线。

如果您根据其他指标做出订单决定,您可能希望更改您的表格以添加您可以订购的其他一些列。 (可能是“家乡英雄”与“访客”相比,或者是年龄最小的比赛 - 谁知道。)但是,任何其他细节都需要添加到数据库中,以便您可以使用它来创建结果中的偏好。

据说,你可以使用GROUP BY代替联合来减少查询。这也使它足够动态,如果将来有更多的候选人,查询会自动重新调整。因此,您的长查询现在变为:

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 }。