1

我在尝试着:

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

约翰 id=1 打了全部,得分 16,11,12,4 所以前 3 = 39

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

Player_table

id  /   name
------------
1   /   john
2   /   sam
3   /   bill
4   /   joe

事件表

id  /   date
------------------
1   /   01/03/2012
2   /   04/04/2012
3   /   06/06/2012
4   /   08/08/2012

event_id_1_results_table

player_id   /   score
---------------------
1           /   12
3           /   16
0           /   11
0           /   8

event_id_2_results_table

player_id   /   score
---------------------
1           /   16
2           /   14
3           /   11
0           /   14

event_id_3_results_table

player_id   /   score
---------------------
1           /   8
3           /   12
4           /   13
0           /   18

event_id_4_results_table

player_id   /   score
---------------------
2           /   6
3           /   4
4           /   9
0           /   7
4

2 回答 2

0

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

首先,您应该获取$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 个最高分数并将其相加。

根据事件的数量,这可能会以非常丑陋的大型连接查询告终,因为所有事件结果都位于单独的表中,因此如果您可以控制它,我会认真建议重新考虑数据库结构。

于 2012-10-17T09:29:18.697 回答
0

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

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)
于 2012-10-17T09:41:19.850 回答