Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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和mysql中嵌套查询循环的帮助吗?_Php_Mysql_Optimization_Nested Loops - Fatal编程技术网

需要php和mysql中嵌套查询循环的帮助吗?

需要php和mysql中嵌套查询循环的帮助吗?,php,mysql,optimization,nested-loops,Php,Mysql,Optimization,Nested Loops,我正试图做到这一点: <?php $good_customer = 0; $q = mysql_query("SELECT user FROM users WHERE activated = '1'"); // this gives me about 40k users while($r = mysql_fetch_assoc($q)){ $money_spent = 0; $user = $r['user']; // Do queries on a

我正试图做到这一点:

<?php
  $good_customer = 0;
  $q = mysql_query("SELECT user FROM users WHERE activated = '1'"); // this gives me about 40k users

  while($r = mysql_fetch_assoc($q)){
    $money_spent = 0;

    $user = $r['user'];
    // Do queries on another 20 tables
    for($i = 1; $i<=20 ; $i++){
      $tbl_name = 'data' . $i;

      $q2 = mysql_query("SELECT money_spent FROM $tbl_name WHERE user = '{$user}'");
      while($r2 = mysql_fetch_assoc($q2)){
        $money_spend += $r2['money_spent'];
      }

      if($money_spend > 1000000){
        $good_customer += 1;
      }
    }
  }

听起来您的模型有问题。为什么您有20个
数据表
-而不是一个带有
-列的表

然后你可以做一个

Select user, Sum( money_spent ) As total_money_spent
From data
Group By user
甚至

Select Count(*) As good_customer_count
From data
Group By user
Having Sum( money_spent ) > 1000000

根据当前结构,您只能执行以下操作:

Select u.user, d1.money_spent + d2.money_spent + ...
From users u
Join data1 d1 On ( d1.user = u.user )
Join data2 d2 On ( d2.user = u.user )
...

这肯定会比您当前的解决方案更快



而且在页面上花费的时间应该存储在数字字段中。

听起来您的模型有问题。为什么您有20个
数据表
-而不是一个带有
-列的表

然后你可以做一个

Select user, Sum( money_spent ) As total_money_spent
From data
Group By user
甚至

Select Count(*) As good_customer_count
From data
Group By user
Having Sum( money_spent ) > 1000000

根据当前结构,您只能执行以下操作:

Select u.user, d1.money_spent + d2.money_spent + ...
From users u
Join data1 d1 On ( d1.user = u.user )
Join data2 d2 On ( d2.user = u.user )
...

这肯定会比您当前的解决方案更快



在页面上花费的时间应该存储在数字字段中。

您应该将在站点上花费的时间存储为数字(以分钟或秒为单位),而不是时间。然后可以计算该值的平均值和总和。并将日志保存在一个表中。

您应该将在站点上花费的时间存储为数字(以分钟或秒为单位),而不是时间。然后可以计算该值的平均值和总和。并将您的日志保存在一个表中。

由于Peter已经给出了一个很好的答案,我将只发布查询在适当设计下的外观(所有日志数据都在一个表中)

您可以进一步将where条件应用于上述内容,以获得特定时期(周、月等)的统计数据,或者您也可以按其他级别分组

您还可以有效地在同一查询中获取MAX和COUNT(以及标准差和)

当然,要注意索引,以便在更大的数据集上获得最佳性能

编辑:

就在我给彼得+1的时候,我注意到他并没有提到“联盟所有选项”

因此,您可以(这不是最优的,也与其他人给出的设计问题警告不矛盾)


您还可以为这个联合创建一个视图。

因为Peter已经给出了一个很好的答案,所以我只会发布查询在正确设计下的外观(所有日志数据都在一个表中)

您可以进一步将where条件应用于上述内容,以获得特定时期(周、月等)的统计数据,或者您也可以按其他级别分组

您还可以有效地在同一查询中获取MAX和COUNT(以及标准差和)

当然,要注意索引,以便在更大的数据集上获得最佳性能

编辑:

就在我给彼得+1的时候,我注意到他并没有提到“联盟所有选项”

因此,您可以(这不是最优的,也与其他人给出的设计问题警告不矛盾)


您还可以为此联合创建视图。

对于40k用户,您正在创建1+20*40k查询。无论如何,这将是缓慢的。停止将日志保存在20个表中。您应该以另一种方式设计数据库。在一个适当设计的数据库上,这一切都应该通过一个查询来完成

SELECT count(user) as good_customers FROM users JOIN $tbl_name ON users.user = {$tbl_name}.user ON WHERE users.activated = '1' HAVING SUM(money_spent) > 100000.
在最坏的情况下,您还应该为每个表执行一个查询

SELECT user, SUM(money_spent) as money_spent FROM users JOIN $tbl_name ON users.user = {$tbl_name}.user ON WHERE users.activated = '1'.

然后将这20个money_-Used列相加,您就有了答案。

对于4万用户,您将创建1+20*4万个查询。无论如何,这将是缓慢的。停止将日志保存在20个表中。您应该以另一种方式设计数据库。在一个适当设计的数据库上,这一切都应该通过一个查询来完成

SELECT count(user) as good_customers FROM users JOIN $tbl_name ON users.user = {$tbl_name}.user ON WHERE users.activated = '1' HAVING SUM(money_spent) > 100000.
在最坏的情况下,您还应该为每个表执行一个查询

SELECT user, SUM(money_spent) as money_spent FROM users JOIN $tbl_name ON users.user = {$tbl_name}.user ON WHERE users.activated = '1'.

然后将这20个“金钱支出”列相加,您就有了答案。

为什么要对20个不同的表进行查询?您的问题似乎在于数据库设计。张贴你的桌子结构是什么样子的。。这20个++表是日志表,每周存储一次红色报警按钮。数据库设计错误。但这并不少见。搜索“SQL悲观化”和“SQL反模式”。如果你需要一周以上的数据,不要有周表。如果你有太多的数据,你需要一个OLAP数据库。是的,一定要存储在一个表中。您已经了解了为什么存储在多个表中是个坏主意。如果您想知道用户登录的频率,您必须搜索所有日志表。如果您想知道上次登录日期,(可能必须)搜索所有日志表。。。这将是一个主要的性能和维护问题。BTW:为了得到好的答案和注意你的问题,考虑另一个询问如何设计你的表。为什么你在20个不同的表上查询?您的问题似乎在于数据库设计。张贴你的桌子结构是什么样子的。。这20个++表是日志表,每周存储一次红色报警按钮。数据库设计错误。但这并不少见。搜索“SQL悲观化”和“SQL反模式”。如果你需要一周以上的数据,不要有周表。如果你有太多的数据,你需要一个OLAP数据库。是的,一定要存储在一个表中。您已经了解了为什么存储在多个表中是个坏主意。如果您想知道用户登录的频率,您必须搜索所有日志表。如果您想知道上次登录日期,(可能必须)搜索所有日志表。。。这将是一个主要的性能和维护问题。BTW:为了得到好的答案和注意你的问题,考虑另一个询问如何设计你的表。我怎么计算总数?例如00:10:23,00:12:01 etcI认为我们需要关于您的表结构和数据的信息来回答这个问题。如果您花费的钱是“时间”类型。我怎么计算总数?例如00:10:23,00:12:01 etcI认为我们需要有关表结构和数据的信息来回答这个问题。@Unreason:使用并集和内部联接有什么不同?目前我正在使用UNION,结果对我来说有点奇怪。我在试着用内线