需要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,结果对我来说有点奇怪。我在试着用内线