Mysql Can';我找不到一种方法将2个SQL查询减少到1个,而不影响性能

Mysql Can';我找不到一种方法将2个SQL查询减少到1个,而不影响性能,mysql,sql,Mysql,Sql,我有以下SQL查询,它工作得非常好: SELECT COUNT(*), COUNT(DISTINCT `fk_match_id`) FROM `pass` WHERE `passer` IN ('48717','33305','49413','1640') AND `receiver` IN ('48717','33305','49413','1640'); in子句中的数字是player ID,可以从数据库中另一个名为player的表中获得。此表中的每一行都有一个球员ID、

我有以下SQL查询,它工作得非常好:

SELECT COUNT(*), COUNT(DISTINCT `fk_match_id`) 
  FROM `pass` 
  WHERE `passer` IN ('48717','33305','49413','1640') 
  AND `receiver` IN ('48717','33305','49413','1640');
in子句中的数字是player ID,可以从数据库中另一个名为player的表中获得。此表中的每一行都有一个球员ID、一个球队ID和一个比赛ID,这是比赛表的外键

我想使用match_ID自动获取这些玩家ID。我可以按如下方式执行此操作:

SELECT COUNT(*), COUNT(DISTINCT `fk_match_id`) 
  FROM `pass` 
  WHERE `passer` IN 
  (
    SELECT player_id 
      FROM `player` 
      WHERE `team_id` = someTeamID  
      AND `match_id` = someMatchID) 
      AND `receiver` IN 
      (
        SELECT player_id 
          FROM `player` 
          WHERE `team_id` = someTeamID  
          AND `match_id` = someMatchID
      )
  )
然而,显然使用子查询的速度非常慢,事实上,它的使用速度太慢了。即使使用join(如下所示)也太慢了:

SELECT COUNT(*), COUNT(DISTINCT `fk_match_id`) 
  from `pass` st1 
  INNER JOIN `player` st2 
  ON (st1.passer = st2.player_id OR st1.receiver = st2.player_id);
这也太慢了。因此,我想知道是否有可能在两次查询中有效地在0.0秒内完成(在一次查询中获取玩家id,然后运行第一次查询几乎不需要任何时间),或者这完全不可能

任何帮助都将不胜感激

非常感谢

编辑::

相关表格结构如下:

SELECT COUNT(*), COUNT(DISTINCT `fk_match_id`) 
  FROM `pass` 
  WHERE `passer` IN 
  (
    SELECT player_id 
      FROM `player` 
      WHERE `team_id` = someTeamID  
      AND `match_id` = someMatchID) 
      AND `receiver` IN 
      (
        SELECT player_id 
          FROM `player` 
          WHERE `team_id` = someTeamID  
          AND `match_id` = someMatchID
      )
  )
玩家:

通过:

我想计算历史上每个球员在一个给定的阵容中传球给另一个球员的次数。我有一个比赛id和一个球队id。我可以通过查询球员表获得一个球队参与特定比赛的球员:

SELECT player_id 
  FROM `player` 
  WHERE `team_id` = someTeamID  
  AND `match_id` = someMatchID
这将返回类似于:

180319301331017645884515157519382160188921200241011466888097959013


然后,我想查询pass表并返回passer和receiver列中的每一行,其中一个id位于其中。

您需要在
(passer,receiver)
上创建一个复合索引:

添加后,请尝试加入

SELECT COUNT(*), COUNT(DISTINCT fk_match_id) 
FROM pass
  INNER JOIN player AS p 
    ON pass.passer = p.player_id
  INNER JOIN player AS r 
    ON r.player_id = pass.passer  ;
如果您想要特定的
(球队id,比赛id)
组合的这些结果,请添加
(球队id,比赛id,球员id)
索引,然后使用:

SELECT COUNT(*), COUNT(DISTINCT fk_match_id) 
FROM pass
  INNER JOIN player AS p 
    ON  p.team_id = someTeamID  
    AND p.match_id` = someMatchID
    AND p.player_id = pass.passer 
  INNER JOIN player AS r
    ON  r.team_id = someTeamID  
    AND r.match_id` = someMatchID
    AND r.player_id = pass.receiver ;

你能提供样本数据和期望的结果吗?表格布局呢?在你的领域里可能需要做一些索引工作。所有的*_id字段以及接收者和传递者都被索引了吗?我已经添加了更多的细节。它们都是索引,是:/player.match\u id
和pass.fk\u match\u id列之间有什么区别?它们存储不同的数据吗?