PHP + Mysql显示一行中多行的值

时间:2017-07-24 09:12:31

标签: php mysql

您好我一直在这里找到解决我的烦恼的方法,但这次我真的不知道如何搜索我需要的东西,然后我会在这里发布希望(但我确定)某个人可以帮助我使这个查询工作。

我是真正集会的开发者(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;

只是想知道这是否是显示我需要的数据的正确方法

1 个答案:

答案 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字段点插入。

所以,你可以看到有多种方法可以做你想要的。 我的建议是:如果还有一个查询可以帮助您更简单地获取代码,即使存在计算开销(在这种情况下嵌套循环中有多个查询),也可以使用它。 希望这对你有所帮助。 祝你好运!