Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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_Database_Count - Fatal编程技术网

Php 计算来自大型数据库的结果数

Php 计算来自大型数据库的结果数,php,mysql,database,count,Php,Mysql,Database,Count,我有两个数据库表,一个有165个条目。对于每一个条目,我都要浏览100万条记录表,看看上面提到的165条记录中的每一条记录有多少次 “赔率提供者”有165个条目,“bettingoffer”有一百万个条目 $SQL = "SELECT odds_provider.id AS id, odds_provider.name AS name, COUNT(bettingoffer.odds_providerFK) AS betcount FROM odds_pr

我有两个数据库表,一个有165个条目。对于每一个条目,我都要浏览100万条记录表,看看上面提到的165条记录中的每一条记录有多少次

“赔率提供者”有165个条目,“bettingoffer”有一百万个条目

    $SQL = "SELECT
    odds_provider.id AS id,
    odds_provider.name AS name,
    COUNT(bettingoffer.odds_providerFK) AS betcount
    FROM odds_provider
    INNER JOIN
    bettingoffer
    ON bettingoffer.odds_providerFK = odds_provider.id
    WHERE 
    odds_provider.active = 'yes'
    GROUP BY
    odds_provider.id,
    odds_provider.name
    ORDER BY betcount DESC";

    $result = mysql_query($SQL);
    while ($db_field = mysql_fetch_assoc($result)) {
echo $db_field['id'] , " " , $db_field['name'] , " " , $db_field['betcount'] , "</BR>";
    }           
$SQL=“选择
将provider.id作为id,
将provider.name作为名称,
将(bettingoffer.赔率提供程序fk)计算为betcount
从你的供应商
内连接
贝丁格尔
关于bettingoffer.Lobbits\u providerFK=Lobbits\u provider.id
哪里
赔率\u provider.active='是'
分组
您的提供商id,
您的提供者名称
按BETCUNT DESC订购”;
$result=mysql\u查询($SQL);
而($db\u field=mysql\u fetch\u assoc($result)){
echo$db_字段['id']、“”、$db_字段['name']、“”、$db_字段['betcount']、“
”; }

它会做你想做的事,但这需要永远。有更快的方法吗?

您可以使用SQL连接查询以更好的方式完成。您不必在第二个表中搜索第一个表中的每个记录。可以在表之间建立联接关系

如果您已经粘贴了两个表的模式定义,这将更有帮助,但一般来说,连接查询就是这样工作的


敬请告知联接查询的工作原理。

您应该能够使用SQL联接这两个表。不过,最好不要进行计数(*)。通过指定要计数的特定列,可以获得更好的性能

SELECT
  op.id,
  op.name,
  COUNT(bo.odds_providerFK) AS bet_offering_count
FROM
 odds_provider op
 INNER JOIN
 bettingoffer bo
  ON bo.odds_providerFK = op.id
 WHERE 
  op.active = 'yes'
GROUP BY
  op.id,
  op.name

这一个应该更快,特别是如果没有太多不活动的ID

SELECT id, name, betcount
FROM (
  SELECT
    odds_providerFK as id,
    COUNT(*) as betcount
  FROM bettingoffer
  WHERE active = 'yes'
  GROUP BY odds_providerFK
  ORDER BY betcount DESC) as counts
USING (id);

内部连接不是问题,我知道怎么做。问题是将计数结果作为数组获取。这就是join的代码:内部join bettingoffer ON bettingoffer.赔率\u providerFK=赔率\u provider.id您的目标是什么?是否要为第一个表中的每个条目查找第二个表中的条目数?您应该使用的联接类型将取决于您的目标是否在bettingoffer上进行左联接。赔率\u providerFK=赔率\u provider.i使用我提到的左联接。LEFT JOIN on bettingoffer.Lobbits\u providerFK=Lobbits\u provider.i实际上,在MYSQL中,
COUNT(*)
通常比
COUNT(column)
快。对于MyISAM表,COUNT()将快得多,因为它缓存了列计数。InnoDB表不缓存行计数,因此count()将变慢。这两个表上有哪些索引?您可以在MySQL提示符下(或通过PHPMyAdmin)尝试并告诉我们
EXPLAIN SELECT…
output吗?bettingoffer表中有多少不同的赔率?有多少是非活动的?