Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从另一个表中选择值-速度太慢_Php_Mysql - Fatal编程技术网

Php 从另一个表中选择值-速度太慢

Php 从另一个表中选择值-速度太慢,php,mysql,Php,Mysql,我的查询加载时间有一个很大的问题。在这种情况下,我需要主队id和客队id(表:比赛)的hg\u ft\u won(表:值)列中的值 它确实发挥了应有的作用。加载只需要很长时间。有没有人知道如何通过另一个查询来改进这一点 $sql = $conn->query("SELECT m.home_team_name, m.away_team_name, m.home_team_id, m.away_team_id, m.startin

我的查询加载时间有一个很大的问题。在这种情况下,我需要主队id客队id(表:比赛)的hg\u ft\u won(表:值)列中的值

它确实发挥了应有的作用。加载只需要很长时间。有没有人知道如何通过另一个查询来改进这一点

$sql = $conn->query("SELECT m.home_team_name, 
       m.away_team_name, 
       m.home_team_id, 
       m.away_team_id, 
       m.starting_time, 
       m.starting_date, 
       m.match_id, 
       m.season_id, 
       m.competition_id, 
       s.season_name, 
       s.country_name, 
       s.competition_name, 

  (SELECT hg_ft_won 
   FROM `values` v 
   WHERE m.home_team_id = v.team_id 
     AND m.season_id = v.season_id ) AS hg_ft_won1, 

  (SELECT hg_ft_won 
   FROM `values` v 
   WHERE m.away_team_id = v.team_id 
     AND m.season_id = v.season_id ) AS hg_ft_won2, 

FROM matches m, 
     seasons s
WHERE m.season_id = s.id 
AND m.starting_date = '2017-02-11'");
值表

火柴桌

来自webgetest.org的结果

切勿在
FROM
子句中使用逗号。始终使用正确、明确的
JOIN
语法。这基本上是您的查询:

SELECT . . .
       (SELECT hg_ft_won 
        FROM `values` v 
        WHERE m.home_team_id = v.team_id AND m.season_id = v.season_id
      ) AS hg_ft_won1, 
      (SELECT hg_ft_won 
       FROM `values` v 
       WHERE m.away_team_id = v.team_id AND
             m.season_id = v.season_id
      ) AS hg_ft_won2,
FROM matches m JOIN 
     seasons s
     ON m.season_id = s.id LEFT JOIN
     competition
     ON competition.id = ?.competition_id 
WHERE m.starting_date = '2017-02-11'");
对于此查询,您需要索引:

  • 匹配(开始日期、季节id)
  • 季节(id)
    (可能已经有了)
  • 竞赛(id)
    (可能已经有了)
  • 价值观(球队id、赛季id、hg\u ft\u won)
我不知道比赛id在哪里。它应该添加到它所属的表的最后一个键。

FROM
子句中不要使用逗号。始终使用正确、明确的
JOIN
语法。这基本上是您的查询:

SELECT . . .
       (SELECT hg_ft_won 
        FROM `values` v 
        WHERE m.home_team_id = v.team_id AND m.season_id = v.season_id
      ) AS hg_ft_won1, 
      (SELECT hg_ft_won 
       FROM `values` v 
       WHERE m.away_team_id = v.team_id AND
             m.season_id = v.season_id
      ) AS hg_ft_won2,
FROM matches m JOIN 
     seasons s
     ON m.season_id = s.id LEFT JOIN
     competition
     ON competition.id = ?.competition_id 
WHERE m.starting_date = '2017-02-11'");
对于此查询,您需要索引:

  • 匹配(开始日期、季节id)
  • 季节(id)
    (可能已经有了)
  • 竞赛(id)
    (可能已经有了)
  • 价值观(球队id、赛季id、hg\u ft\u won)

我不知道比赛id在哪里。应该将它添加到它所属的表的最后一个键处。

尝试此查询。尽可能创建所需的索引

SELECT m.home_team_name, m.away_team_name, m.home_team_id, m.away_team_id, m.starting_time, m.starting_date, m.match_id, m.season_id, m.competition_id, s.season_name, s.country_name, s.competition_name, v1.hg_ft_won AS hg_ft_won1, v2.hg_ft_won AS hg_ft_won2, FROM matches m INNER JOIN seasons s ON m.season_id = s.id LEFT JOIN `values` v1 ON m.home_team_id = v1.team_id AND m.season_id = v1.season_id LEFT JOIN `values` v2 ON m.home_team_id = v2.team_id AND m.season_id = v2.season_id AND m.starting_date = '2017-02-11' 选择m.home\u团队名称, m、 客场球队的名字, m、 主队id, m、 客队, m、 开始时间, m、 开始日期, m、 匹配id, m、 第二季, m、 竞赛id, s、 你的名字, s、 国名, s、 比赛名称, v1.hg_ft_won作为hg_ft_won 1, v2.hg_ft_won作为hg_ft_won 2, 从m 在m.seasure\u id=s.id上的内部连接seasures s 左键在m.home\u team\u id=v1.team\u id和m.seasure\u id=v1.seasure\u id上加入'values`v1 左键在m.home\u team\u id=v2.team\u id和m.seasure\u id=v2.seasure\u id上加入'values`v2 m.起始日期='2017-02-11'
请尝试此查询。尽可能创建所需的索引

SELECT m.home_team_name, m.away_team_name, m.home_team_id, m.away_team_id, m.starting_time, m.starting_date, m.match_id, m.season_id, m.competition_id, s.season_name, s.country_name, s.competition_name, v1.hg_ft_won AS hg_ft_won1, v2.hg_ft_won AS hg_ft_won2, FROM matches m INNER JOIN seasons s ON m.season_id = s.id LEFT JOIN `values` v1 ON m.home_team_id = v1.team_id AND m.season_id = v1.season_id LEFT JOIN `values` v2 ON m.home_team_id = v2.team_id AND m.season_id = v2.season_id AND m.starting_date = '2017-02-11' 选择m.home\u团队名称, m、 客场球队的名字, m、 主队id, m、 客队, m、 开始时间, m、 开始日期, m、 匹配id, m、 第二季, m、 竞赛id, s、 你的名字, s、 国名, s、 比赛名称, v1.hg_ft_won作为hg_ft_won 1, v2.hg_ft_won作为hg_ft_won 2, 从m 在m.seasure\u id=s.id上的内部连接seasures s 左键在m.home\u team\u id=v1.team\u id和m.seasure\u id=v1.seasure\u id上加入'values`v1 左键在m.home\u team\u id=v2.team\u id和m.seasure\u id=v2.seasure\u id上加入'values`v2 m.起始日期='2017-02-11'
您可以首先使用联接而不是子查询来获取
hg_ft_won1
hg_ft_won2
。您还应该检查您的表是否已正确索引。我已尝试内部联接,但无法使其工作。什么不工作?错误?错误的结果?你可以先使用连接而不是子查询来获取
hg_ft_won1
hg_ft_won2
。您还应该检查您的表是否已正确索引。我已尝试内部联接,但无法使其工作。什么不工作?错误?错误的结果?也请发布该尝试。谢谢您的帮助!它能工作,但它并不比我得到的快多少。matches表有大约2000行和20列,values表有2000行和400(是)列。这可能是原因吗?@vloryan。这不是很多数据。查询需要多长时间?加载大约需要4秒。我刚刚添加了WebGetTest的结果。org@vloryan . . . 您确定瓶颈是查询而不是屏幕上的图形吗?如果您直接将数据放入一个表中,并将其用于计时测试,会发生什么?我在页面上没有一个图像或任何其他内容。这一个查询就是测试页面上的全部内容。感谢您的帮助!它能工作,但它并不比我得到的快多少。matches表有大约2000行和20列,values表有2000行和400(是)列。这可能是原因吗?@vloryan。这不是很多数据。查询需要多长时间?加载大约需要4秒。我刚刚添加了WebGetTest的结果。org@vloryan . . . 您确定瓶颈是查询而不是屏幕上的图形吗?如果您直接将数据放入一个表中,并将其用于计时测试,会发生什么?我在页面上没有一个图像或任何其他内容。这一个查询就是测试页面上的全部内容。