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

标签 php mysql xampp

我正在 XAMMP 中使用 PHP 和 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

最佳答案

@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 .

关于php - 如何使用 PHP 打破 MySQL 查询的束缚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17657281/

相关文章:

java - 将 jdk 8 迁移到 jdk 11,mysql 为 SSL 抛出错误

mysql - 升级到新版本的 XAMPP 后从文件恢复 MySQL 数据库

javascript - AJAX PHP变量来填充表单字段jquery

php - 显示 php 测验的结果而不重新加载页面

mysql - 选择查询但显示第 3 条记录的结果

php - Sphinx的这个SQL语句有什么问题吗?

php - #1045 无法登录 MySQL 服务器

tomcat - 如何在 XAMPP 中升级 Tomcat

php - 运行 phpwebsocket 服务器 .php

PHP/MYSQL 将每一行的每一列乘以所选值