gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:29:15 25 4
gpt4 key购买 nike

我正在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com