我想:
对于每位玩家,从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
答案 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)