Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 来自4个以上表格的前3名结果_Php_Mysql - Fatal编程技术网

Php 来自4个以上表格的前3名结果

Php 来自4个以上表格的前3名结果,php,mysql,Php,Mysql,我正在努力: 对于每个玩家,从events_表中列出的每个事件中获取他们的结果,并显示他们最佳3个结果的总和,因此: 约翰id=1打满全场,得分16分、11分、12分、4分,因此前3名=39分 获取这些数据最简单的方法是什么 牌桌 事件表 事件\u id\u 1\u结果\u表 事件\u id\u 2\u结果\u表 事件\u id\u 3\u结果\u表 事件\u id\u 4\u结果\u表 假设您必须使用此数据库结构 首先,您应该在$events变量中获取事件,然后使用事件ID生成结果查询,如下所

我正在努力:

对于每个玩家,从events_表中列出的每个事件中获取他们的结果,并显示他们最佳3个结果的总和,因此:

约翰id=1打满全场,得分16分、11分、12分、4分,因此前3名=39分

获取这些数据最简单的方法是什么

牌桌

事件表

事件\u id\u 1\u结果\u表

事件\u id\u 2\u结果\u表

事件\u id\u 3\u结果\u表

事件\u id\u 4\u结果\u表

假设您必须使用此数据库结构

首先,您应该在$events变量中获取事件,然后使用事件ID生成结果查询,如下所示:

$results = array();
$event_joins = array();
foreach ($events as $v) {
   // eX.score AS eX_score
   $results[] = "e".$v['id'].".score AS e".$v['id']."_score"; 
   // LEFT JOIN event_id_X_results_table AS eX ON eX.player_id = Pt.id
   $event_joins = " LEFT JOIN event_id_".$v['id']."_results_table AS e".$v['id']."
                    ON e".$v['id'].".player_id = Pt.id ";
}
$qs = "SELECT Pt.*, 
      ".implode(",", $results)."
      FROM Player_table AS Pt
      ".implode("", $event_joins);
上面生成的查询将生成如下表:

id / name / e1_score / e2_score / e3_score / e4_score
-----------------------------------------------------
 1 / john /       12 /       16 /        8 /     NULL
 2 / sam  /     NULL /       14 /     NULL /        6
 3 / bill /       16 /       11 /       12 /        4
 4 / joe  /     NULL /     NULL /       13 /        9
使用此结果,您可以确定每个玩家的3个最高分数,并将其相加


由于所有事件结果都在单独的表中,根据事件的数量,这可能会导致非常丑陋的大型联合查询,因此我郑重建议重新考虑数据库结构(如果您可以控制它)。

如果您需要或希望保留不同的表,请使用联合:

select sum(score)
from ((select score from event_id_1_results_table where player_id = 1)
       union
       (select score from event_id_2_results_table where player_id = 1)
       union
       (select score from event_id_3_results_table where player_id = 1)
       order by score desc limit 3)

为什么在不同的表中保留不同的事件?如果控制表、合并不同的表并添加额外的列event_id,则为所有事件保留一个表并引入eventId列将更容易。这将避免所有错误,并使向应用程序添加新事件更容易。也就是说,你可以用一个子查询来解决这个问题。我认为它可以让每个事件的查询更快,在很多事件之后,一个组合表会变得非常大。我建议首先重新设计你的数据库结构。如果两年后你有40项活动,情况如何?40个不同的表,每个表上有相同的字段?您将为每个新事件扩展您现在正在寻找的这类查询?由于反馈,我将考虑更改数据库结构。如果您是aorcsik,我将尝试一下。我确实控制了数据库,所以我会考虑将其更改为1个带有事件id的表谢谢你Olaf,我也会尝试一下,我玩过这个,通过快速编辑,它完成了我现在需要的。谢谢
player_id   /   score
---------------------
1           /   16
2           /   14
3           /   11
0           /   14
player_id   /   score
---------------------
1           /   8
3           /   12
4           /   13
0           /   18
player_id   /   score
---------------------
2           /   6
3           /   4
4           /   9
0           /   7
$results = array();
$event_joins = array();
foreach ($events as $v) {
   // eX.score AS eX_score
   $results[] = "e".$v['id'].".score AS e".$v['id']."_score"; 
   // LEFT JOIN event_id_X_results_table AS eX ON eX.player_id = Pt.id
   $event_joins = " LEFT JOIN event_id_".$v['id']."_results_table AS e".$v['id']."
                    ON e".$v['id'].".player_id = Pt.id ";
}
$qs = "SELECT Pt.*, 
      ".implode(",", $results)."
      FROM Player_table AS Pt
      ".implode("", $event_joins);
id / name / e1_score / e2_score / e3_score / e4_score
-----------------------------------------------------
 1 / john /       12 /       16 /        8 /     NULL
 2 / sam  /     NULL /       14 /     NULL /        6
 3 / bill /       16 /       11 /       12 /        4
 4 / joe  /     NULL /     NULL /       13 /        9
select sum(score)
from ((select score from event_id_1_results_table where player_id = 1)
       union
       (select score from event_id_2_results_table where player_id = 1)
       union
       (select score from event_id_3_results_table where player_id = 1)
       order by score desc limit 3)