为了账号安全,请及时绑定邮箱和手机立即绑定

Mysql 列摘要

Mysql 列摘要

PHP
慕斯709654 2023-07-21 18:31:12
我需要将每一行的列汇总在一起,就像排行榜一样。外观如何:Name | country | track 1 | track 2 | track 3 | Total  John     ENG       32        56        24 Peter    POL       45        43        35这里有两个问题,我可以使用update 'table' set Total = track 1 + track 2 + track 3但它并不总是 3 个轨道,从 3 到 20 个不等。 其次,如果我不在 mysql 中对其进行求和,那么当我在 HTML/php 中呈现数据时,我将无法对它进行排序。或者还有其他一些聪明的方法来构建排行榜吗?
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

您需要重新设计表格,以包含名称、国家/地区、曲目编号和数据的列。然后,如果有一个只有 3 个曲目编号的宽表,那么您将拥有一个又高又薄的表格,每行都是给定名称、国家/地区和曲目的数据。


然后你可以使用类似的东西来总结


 SELECT 

     country, 

     name, 

     sum(data) as total

 FROM trackdata 

 GROUP BY

     name, 

     country

ORDER BY

    sum(data) desc

看看这里我做了一个 SQL 小提琴,显示它按照你想要的方式工作


然而,根据您的预期数据,您可能真的最好为国家/地区建立一个单独的表,其中每个国家/地区名称仅出现一次(也可能用于名称)。例如,如果 John 始终与 ENG 关联,那么您有一个重复组,最好从上表中删除该关联,该关联实际上与赛道上的分数有关,而不是与谁在哪个国家/地区有关,并将其放入自己的表中,然后将其连接到赛道数据。


完整的解决方案可能包含下表


**Athlete**

athlete_id

athlete_name

(other data about athletes)


**Country**

country_id

country_name

(other data about countries)


**Track**

Track_id       

Track_number

(other data about tracks)


**country_athlete**   (this joining table allows for the one to many of one country having many athletes

country_athlete_id

country_id

athlete_id


**Times**

country_athlete_id   <--- this identifies a given combination of athlete and country 

track_id             <--- this identifies the track       

data                 <--- this is where you store the actual time

根据您的数据,它可能会变得更加复杂,例如相同的曲目编号是否会出现在不同的国家/地区?如果是这样,那么您需要另一个连接表来将一个轨道号码连接到许多国家。


或者,即使我的 SQL 小提琴示例设计很差,创建名称、国家/地区和跟踪主键也可能是件好事,这样对于给定的名称、国家/地区和跟踪组合,您只能拥有一个“数据”值。然而,这个决定以及将表规范化为多个连接表的决定将基于您期望获得的数据。


但无论哪种方式,只要您说“我不知道会有多少个轨道”,那么您就应该开始思考“每个轨道的数据出现在一行而不是一列中”。


查看完整回答
反对 回复 2023-07-21
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

我仍然遇到很多问题......但我不认为问题出在数据库上,我认为问题更多在于我在网络上发布日期的方式。我能够获取所有数据等。唯一的问题是我的填写方式不正确。


What I do now is like: "SELECT * FROM `times` NATURAL JOIN `players`


Then <?php foreach... ?>

<tr>

<td>  <?php echo $row[playerID];?> </td>

<td>  <?php echo $row[Time];?> </td>

....

问题是,使用这个静态表解决方案很难将排序、排序和求和全部放在一起。我四处寻找排行榜,我真的不明白他们是如何通过活跃订单等来构建排行榜的。https://www.pgatour.com/leaderboard.html 他们是如何建立这样的排行榜的?排序和一切。


查看完整回答
反对 回复 2023-07-21
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

就像其他人提到的那样,您需要重新设计数据库。您的Leaderboard表和新的Tracks表之间需要建立一对多关系。这意味着一个用户可以拥有 多个轨道,每个轨道由轨道表中的一条记录表示。

这两个数据库应该通过外键连接,在本例中它可以是user_id字段。

每次插入或更新新曲目时,排行榜表中的字段total都可以更新,或者您可以有一个与您想要的查询类似的查询。此类查询如下所示

UPDATE leaderboard SET total = (
  SELECT SUM(track) FROM tracks WHERE user_id = leaderboard.user_id
)
查看完整回答
反对 回复 2023-07-21
  • 3 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信