4个表中的前3个结果

时间:2012-10-17 09:07:54

标签: php mysql

我想:

对于每位玩家,从events_table中列出的每个事件中获取结果,并显示最佳3个结果中的总数,以便:

John id = 1全场比赛,得分16,11,12,4,所以前3 = 39

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

Player_table

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

Events_table

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

2 个答案:

答案 0 :(得分: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个最高得分并总结。

根据事件的数量,这可能会以真正的丑陋大型连接查询结束,因为所有事件结果都在不同的表中,所以我会认真推荐重新思考数据库结构如果你有控制权。

答案 1 :(得分:0)

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

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)