gpt4 book ai didi

mysql - 在行数较少的表上使用多个左连接进行查询超出 max_join_size

转载 作者:行者123 更新时间:2023-11-29 20:59:18 26 4
gpt4 key购买 nike

我正在为我本地的足球队制作一个网站,我想在一个页面上显示每个团队成员的一些简单数据(场上位置、比赛次数、进球数等)。我尝试通过对数据库的一次查询来选择所有需要的数据,因为我了解到最大限度地减少网络调用次数有利于页面加载时间。一开始我以为我已经成功了,因为一切都按我想要的方式显示,但现在我们已经进入赛季几场比赛,带有查询的页面显示错误:The SELECT will check 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_tpos_t 我只选择一些列(姓名、 Jersey 号码、位置等),而对于其他列,我计算结果以获得总数(比赛次数、进球数、红牌和黄牌等)。我加入同一张 table 两次(例如我先计算进球,然后在同一张 table 的帮助下计算助攻),不知道这是否是一个不好的方法。

也许有一个明显的解释。如果您需要更多信息,请告诉我。我希望你能帮助我找到一种有效的方法来收集每个团队成员的数据。谢谢!

最佳答案

尽量减少查询数量并不总是一个好主意。首先,此类查询更难以维护。其次,情况并不总是如此,一个大查询会比几个较小的查询更有效。这取决于。

如果您要执行多个查询,例如每个统计数据一个,一次为所有玩家获取它,那么应该没问题。如果您要针对每个玩家进行查询,那就不行了。

关于mysql - 在行数较少的表上使用多个左连接进行查询超出 max_join_size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37372626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com