您好我一直在这里找到解决我的烦恼的方法,但这次我真的不知道如何搜索我需要的东西,然后我会在这里发布希望(但我确定)某个人可以帮助我使这个查询工作。
我是真正集会的开发者(A richard Burns Rally Mod bla bla bla)。 我们现在需要一个自动化系统来展示每个锦标赛的最终状态。
我从16个查询中获取了所有必要信息,并将它们存储到临时数据库中。
这意味着我每次夺冠(蒙特卡洛,瑞典,墨西哥等) 临时表内的15个结果。 15蒙特卡洛 15瑞典 等等
然后我运行此查询
SELECT Id, totale, num_prove, IdPilota, Nome, Cognome, Team, Nazionalita, Plate, Classe, VetturaUsata, Penalita, PaPenalty, PuntiCarriera, PuntiCarrieraP,
PuntiMon, PuntiSve, PuntiMes, PuntiArg, PuntiPor, PuntiIta, PuntiPol, PuntiFin, PuntiGer, PuntiCin, PuntiFra, PuntiSpa, PuntiGrb, PuntiAus, RallyCorso,
SUM(PuntiMon) + SUM(PuntiSve) + SUM(PuntiMes) + SUM(PuntiArg) + SUM(PuntiPor) + SUM(PuntiIta) + SUM(PuntiPol) + SUM(PuntiFin) + SUM(PuntiGer) + SUM(PuntiCin) + SUM(PuntiFra) + SUM(PuntiSpa) + SUM(PuntiGrb) + SUM(PuntiAus) AS Punti
FROM temp_table_5975a9e73a835
GROUP BY IdPilota
ORDER BY Punti DESC;
现在最糟糕的是什么。
这个查询工作,但我需要显示每个冠军的每个IdPilota点。
atm the displayed data show 43 0 0 0 0 0 due to group by IdPilota:
但是我需要消除每个冠军赛中获得的正确分数
有一种方法可以显示我需要的东西吗?
43 <- from (Montecarlo)
33 <- from (Sweden)
43 <- from (Mexico)
43 <- from (Argentina)
43 33 43 43
希望能解释我需要的东西!!!
编辑: 这是工作查询atm:
SELECT Id, totale, num_prove, IdPilota, Nome, Cognome, Team, Nazionalita, Plate, Classe, VetturaUsata, Penalita, PaPenalty, PuntiCarriera, PuntiCarrieraP,
SUM(PuntiMon), SUM(PuntiSve), SUM(PuntiMes), SUM(PuntiArg), SUM(PuntiPor), SUM(PuntiIta), SUM(PuntiPol), SUM(PuntiFin), SUM(PuntiGer), SUM(PuntiCin), SUM(PuntiFra), SUM(PuntiSpa), SUM(PuntiGrb), SUM(PuntiAus), RallyCorso,
SUM(PuntiMon) + SUM(PuntiSve) + SUM(PuntiMes) + SUM(PuntiArg) + SUM(PuntiPor) + SUM(PuntiIta) + SUM(PuntiPol) + SUM(PuntiFin) + SUM(PuntiGer) + SUM(PuntiCin) + SUM(PuntiFra) + SUM(PuntiSpa) + SUM(PuntiGrb) + SUM(PuntiAus) AS Punti
FROM temp_table_5975a9e73a835
GROUP BY IdPilota
ORDER BY Punti DESC;
只是想知道这是否是显示我需要的数据的正确方法
答案 0 :(得分:1)
我不知道您是否有特定的限制或限制,但我通常不会将业务逻辑与表示逻辑混合在一起。在这种情况下,我宁愿不创建临时表(可能视图更好),因为您使用它来显示表示层上的表。 我假设我有这样的数据模型(我再说一遍:我不知道你的情况是否存在)
表“PILOTI”
+--------+-------------+
| ID | NOME |
+--------+-------------+
| 1 | Colin McRea |
+--------+-------------+
| 2 | Carlos Sainz|
+--------+-------------+
表“GARE”
+--------+-------------+
| ID | NOME |
+--------+-------------+
| 1 | Montecarlo |
+--------+-------------+
| 2 | Argentina |
+--------+-------------+
| 3 | Svezia |
+--------+-------------+
表“CAMPIONATO”(n-n =&gt; GARE和PILOTI之间的关系表)
+--------+-------------+-------------+-------------+
| ID | ID_PILOTA | ID_GARA | PUNTEGGIO |
+--------+-------------+-------------+-------------+
| 1 | 1 | 1 | 43 |
+--------+-------------+-------------+-------------+
| 2 | 1 | 2 | 33 |
+--------+-------------+-------------+-------------+
| 3 | 2 | 1 | 15 |
+--------+-------------+-------------+-------------+
| 4 | 2 | 2 | 18 |
+--------+-------------+-------------+-------------+
通过此查询,我为每个驱动程序检索到达每个锦标赛的积分
SELECT P.NOME, G.NOME, C.PUNTEGGIO
FROM CAMPIONATO C
JOIN PILOTI P ON P.ID = C.ID_PILOTA
JOIN GARE G ON G.ID = C.ID_GARA
您可以添加“WHERE”条件以过滤单个驱动程序(或单个锦标赛)。 例如,如果您有15个驱动程序,则只需添加15个查询即可检索到达每个驱动程序的点数(对于每个冠军)
WHERE P.ID = :id_pilota
对于好的查询。
您也可以使用此查询创建一个视图并计算总点数,但我更喜欢在PHP中而不是在MySQL中执行此操作。 I.E. (伪代码)
foreach($driver){
queryToGetPoints();
foreach($championship){
$totalPoints+=$points;
}
printHtmlRow();
}
然而,使用MySql,订购更简单
SELECT P.NOME,SUM(C.PUNTEGGIO) AS TOTALE
FROM CLASSIFICA C
JOIN PILOTI P ON P.ID = C.ID_PILOTA
GROUP BY C.ID_PILOTA
ORDER BY TOTALE ASC
为了更新积分,在锦标赛结束后,您可以在“CAMPIONATO”表中插入,为每位车手添加一个新行,用自己的ID,冠军的ID和到达的分数。
即
INSERT INTO CAMPIONATO (ID_PILOTA, ID_GARA, PUNTEGGIO) VALUES (1,3,18)
=&GT;麦瑞达在Svezia达到18分
你也可以在两个字段中创建一个表“CLASSIFICA”:ID_PILOTA e TOTALE然后在“CAMPIONATO”表“插入后”创建一个触发器,以便用旧值+的总和更新CAMPIONATO.TOTALE字段点插入。
所以,你可以看到有多种方法可以做你想要的。 我的建议是:如果还有一个查询可以帮助您更简单地获取代码,即使存在计算开销(在这种情况下嵌套循环中有多个查询),也可以使用它。 希望这对你有所帮助。 祝你好运!