Php 来自4个以上表格的前3名结果
我正在努力: 对于每个玩家,从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生成结果查询,如下所示: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生成结果查询,如下所
$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)