我正在为我的当地足球队建立一个网站,在一个页面上我想为每个队员显示一些简单的数据(场上位置,比赛次数,得分数等等)。我尝试通过一个查询选择所有需要的数据到数据库,因为我已经了解到最小化网络调用的数量有利于页面加载时间。我以为我一开始就成功了,因为所有内容都显示为我想要的,但是现在我们在本赛季的几场比赛中,带有查询的页面显示错误:The SELECT would examine more than MAX_JOIN_SIZE rows
。 max_join_size设置为4 000 000,所以我认为我在查询中做了一些可怕的错误,让它返回那么多行。我想我写的这个问题有点过头了,因为我很难想象它能真正看出我做错了什么。也许有些人可以帮助我?这是查询,在我尝试解释之后:
SELECT member_t.shirt_number, member_t.name, member_t.surname, pos_t.name AS position, pos_t.order_num AS posorder,
COUNT(DISTINCT m_m.match_id) AS matchnum, COUNT(DISTINCT goal_t.match_id, goal_t.internal_id) as goalnum, COUNT(DISTINCT assist_t.match_id, assist_t.internal_id) AS assistnum, COUNT(DISTINCT match_t.id) AS momnum, COUNT(DISTINCT yc_t.match_id, yc_t.internal_id) AS ycnum, COUNT(DISTINCT rc_t.match_id, rc_t.internal_id) AS rcnum
FROM team_member AS member_t
LEFT JOIN team_member_position AS pos_t ON member_t.position_id = pos_t.id
LEFT JOIN
(SELECT * FROM match_member WHERE match_member.match_id IN (SELECT id FROM football_match WHERE is_finished = 1)) AS m_m ON member_t.id = m_m.team_member_id
LEFT JOIN match_event_goal AS goal_t ON member_t.id = goal_t.team_member_id
LEFT JOIN match_event_goal AS assist_t ON member_t.id = assist_t.team_member_assist_id
LEFT JOIN football_match AS match_t ON member_t.id = match_t.mom_id
LEFT JOIN
(SELECT match_id, internal_id, team_member_id FROM match_event_card WHERE yc = 1) AS yc_t ON member_t.id = yc_t.team_member_id
LEFT JOIN
(SELECT match_id, internal_id, team_member_id FROM match_event_card WHERE rc = 1) AS rc_t ON member_t.id = rc_t.team_member_id
GROUP BY member_t.id
ORDER BY posorder ASC, name ASC
表格(别名)
member_t
:每个团队成员一行。 6列,21行
pos_t
:该字段上的每个位置都有一行。 2列,5行
m_m
:用于结合各个团队成员和个人匹配的表格。 2列,72行
goal_t
/ assist_t
:匹配中每个目标的一行。 6列,17行
match_t
:每个注册的匹配一行。 9列,6行
yc_t
/ rc_t
:匹配中每位有线球员的一排。 6列,10行
因此对于member_t
和pos_t
我只选择一些列(姓名,衬衫号码,职位等),而对于其他人,我会计算结果以获得总数(游戏,目标,红色和黄色卡等)。我两次加入同一张桌子两次(例如我先在同一张桌子的帮助下计算目标,然后帮助),不知道这是不是一个糟糕的方法。
也许有一个明显的解释。如果您需要更多信息,请告诉我。我希望你能帮助我找到一种有效的方法来为每个团队成员收集数据。谢谢!
答案 0 :(得分:0)
最小化查询次数并不总是一个好主意。首先,这种查询更难以维护。其次,并非总是如此,一个大的查询将比几个更小的更有效。这取决于。
如果您要执行多个查询,例如每个统计信息一个,一次为所有玩家获取,那么这应该没问题。如果你每个玩家都在进行查询,那就不行了。