首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PHP打破MySQL查询的束缚?

如何使用PHP打破MySQL查询的束缚?
EN

Stack Overflow用户
提问于 2013-07-15 22:56:49
回答 2查看 313关注 0票数 0

我正在创建一个选美比赛评分系统使用PHP和MySQL或PhpMyAdmin在XAMMP。不知何故,我用MySQL获得了候选人的排名,但也有一些案例可以获得联系。如何使用PHP打破查询结果的束缚?

候选人的排名是根据他们在有5名评委和9名候选人的类别中的得分来确定的。所以我真的不知道该怎么做,也不知道如何用PHP解决它。

如果我想让C9而不是C4排在第一位,该怎么办?

这是我的数据库...希望有人能帮我。提前谢谢。

代码语言:javascript
复制
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  );

这是我的问题:

代码语言:javascript
复制
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

结果将是..

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-15 23:13:38

@JHaasie77有一个很好的方法,使用candidate_no作为排序器(然后归结为字母数字的排序顺序),当你使用降序时,首先做9。(同样,如果您使用升序,则C9将是最后一个)。如果没有更多的非限定符,那么这是最简单的路线。

如果您是基于另一个指标进行排序决策的,那么您可能希望更改您的表,以添加一些可以排序的其他列。(也许是“家乡英雄”对“访客”,也可能是年龄最小的人先结婚--谁知道呢。)但任何其他详细信息都需要添加到数据库中,以便您可以使用它在结果中创建首选项。

也就是说,您可以通过使用GROUP BY而不是union来精简查询。这也使它具有足够的动态性,如果将来有更多的候选者,查询将自动重新调整。因此,您的长查询现在变成:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2013-07-15 23:06:11

您可以添加第二个ORDER BY变量,这样,如果您希望它先按sum排序,然后candidate_no no,它就变成了"ORDER BY sum desc,candidate desc“。第二。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17657281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档