猿问

Mysql 列摘要

我需要将每一行的列汇总在一起,就像排行榜一样。外观如何:

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 中呈现数据时,我将无法对它进行排序。

或者还有其他一些聪明的方法来构建排行榜吗?


慕斯709654
浏览 126回答 3
3回答

小唯快跑啊

您需要重新设计表格,以包含名称、国家/地区、曲目编号和数据的列。然后,如果有一个只有 3 个曲目编号的宽表,那么您将拥有一个又高又薄的表格,每行都是给定名称、国家/地区和曲目的数据。然后你可以使用类似的东西来总结&nbsp;SELECT&nbsp;&nbsp; &nbsp; &nbsp;country,&nbsp;&nbsp; &nbsp; &nbsp;name,&nbsp;&nbsp; &nbsp; &nbsp;sum(data) as total&nbsp;FROM trackdata&nbsp;&nbsp;GROUP BY&nbsp; &nbsp; &nbsp;name,&nbsp;&nbsp; &nbsp; &nbsp;countryORDER BY&nbsp; &nbsp; sum(data) desc看看这里我做了一个 SQL 小提琴,显示它按照你想要的方式工作然而,根据您的预期数据,您可能真的最好为国家/地区建立一个单独的表,其中每个国家/地区名称仅出现一次(也可能用于名称)。例如,如果 John 始终与 ENG 关联,那么您有一个重复组,最好从上表中删除该关联,该关联实际上与赛道上的分数有关,而不是与谁在哪个国家/地区有关,并将其放入自己的表中,然后将其连接到赛道数据。完整的解决方案可能包含下表**Athlete**athlete_idathlete_name(other data about athletes)**Country**country_idcountry_name(other data about countries)**Track**Track_id&nbsp; &nbsp; &nbsp; &nbsp;Track_number(other data about tracks)**country_athlete**&nbsp; &nbsp;(this joining table allows for the one to many of one country having many athletescountry_athlete_idcountry_idathlete_id**Times**country_athlete_id&nbsp; &nbsp;<--- this identifies a given combination of athlete and country&nbsp;track_id&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<--- this identifies the track&nbsp; &nbsp; &nbsp; &nbsp;data&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<--- this is where you store the actual time根据您的数据,它可能会变得更加复杂,例如相同的曲目编号是否会出现在不同的国家/地区?如果是这样,那么您需要另一个连接表来将一个轨道号码连接到许多国家。或者,即使我的 SQL 小提琴示例设计很差,创建名称、国家/地区和跟踪主键也可能是件好事,这样对于给定的名称、国家/地区和跟踪组合,您只能拥有一个“数据”值。然而,这个决定以及将表规范化为多个连接表的决定将基于您期望获得的数据。但无论哪种方式,只要您说“我不知道会有多少个轨道”,那么您就应该开始思考“每个轨道的数据出现在一行而不是一列中”。

蝴蝶刀刀

我仍然遇到很多问题......但我不认为问题出在数据库上,我认为问题更多在于我在网络上发布日期的方式。我能够获取所有数据等。唯一的问题是我的填写方式不正确。What I do now is like: "SELECT * FROM `times` NATURAL JOIN `players`Then <?php foreach... ?><tr><td>&nbsp; <?php echo $row[playerID];?> </td><td>&nbsp; <?php echo $row[Time];?> </td>....问题是,使用这个静态表解决方案很难将排序、排序和求和全部放在一起。我四处寻找排行榜,我真的不明白他们是如何通过活跃订单等来构建排行榜的。https://www.pgatour.com/leaderboard.html 他们是如何建立这样的排行榜的?排序和一切。

米琪卡哇伊

就像其他人提到的那样,您需要重新设计数据库。您的Leaderboard表和新的Tracks表之间需要建立一对多关系。这意味着一个用户可以拥有 多个轨道,每个轨道由轨道表中的一条记录表示。这两个数据库应该通过外键连接,在本例中它可以是user_id字段。每次插入或更新新曲目时,排行榜表中的字段total都可以更新,或者您可以有一个与您想要的查询类似的查询。此类查询如下所示:UPDATE leaderboard SET total = (   SELECT SUM(track) FROM tracks WHERE user_id = leaderboard.user_id )
随时随地看视频慕课网APP
我要回答