Php 将查询优化为一个查询

Php 将查询优化为一个查询,php,mysql,Php,Mysql,谁能帮我减少这个代码 $dat= mysql_query ("SELECT wid,count(*) as count FROM uptime WHERE time_stamp>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) AND status<>200 GROUP BY wid ORDER BY time_stamp ASC" ); while($ans= mysql_fetch_assoc($dat)) { $cou

谁能帮我减少这个代码

$dat=  mysql_query
("SELECT wid,count(*) as count 
  FROM uptime 
  WHERE time_stamp>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) 
  AND  status<>200 GROUP BY wid ORDER BY  time_stamp ASC"
);

while($ans= mysql_fetch_assoc($dat))
{
   $count_array[]=$ans;
}

foreach ($count_array as $value) 
{
   if($value['count']==2)
   {
      $id=$value['wid'];
      $add=  mysql_query("SELECT email FROM website WHERE webid='".$id."'");
      $result=  mysql_fetch_assoc($add);
      <--etc etc to send email-->
    }
}
$dat=mysql\u查询
(“选择wid,count(*)作为计数
从正常运行时间
其中时间戳>=日期子项(现在(),间隔10分钟)
和状态200按wid顺序按时间分组\u标记ASC“
);
而($ans=mysql_fetch_assoc($dat))
{
$count_数组[]=$ans;
}
foreach($count_数组为$value)
{
如果($value['count']==2)
{
$id=$value['wid'];
$add=mysql_query(“从webid='“$id.””的网站中选择电子邮件”;
$result=mysql\u fetch\u assoc($add);
}
}

我需要减少代码,请帮助我。如果两个查询可以合并而不失去意义,也将有助于我

这是两个表之间的简单连接:

select
    upity.wid,
    webit.email,
    count(*) as count
from
    uptime upity
        join website webby
            on upity.wid=webby.webid
where
    upity.time_stamp>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) 
    and upity.status<>200
group by
    upity.wid,
    webit.email
having count=2
选择
upity.wid,
webit.email,
计数(*)作为计数
从…起
正常运行时间
加入webby网站
关于upity.wid=webby.webid
哪里
upity.time\u stamp>=DATE\u SUB(现在(),间隔10分钟)
和upity.status200
分组
upity.wid,
webit.email
计数=2
我写了一篇文章,将更详细地解释这一切是如何运作的。事实上,我写这篇文章正是为了这个原因——能够通过快速查询提供帮助,然后能够链接到正在发生的事情的详细解释


编辑:根据下面Zerkms和我之间的评论,如果你看了这段代码,一定要看一下执行时间。大型表在连接时可能会产生非常大的数据集,而且运行多个查询确实可能更高效。

这是两个表之间的简单连接:

select
    upity.wid,
    webit.email,
    count(*) as count
from
    uptime upity
        join website webby
            on upity.wid=webby.webid
where
    upity.time_stamp>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) 
    and upity.status<>200
group by
    upity.wid,
    webit.email
having count=2
$dat=  mysql_query("SELECT wid,count(*) as count 
FROM uptime WHERE time_stamp>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) AND  status<>200 GROUP BY wid ORDER BY  time_stamp ASC");
while($ans= mysql_fetch_assoc($dat)){
if($ans['count']==2){
  $id=$value['wid'];
 $add=  mysql_query("SELECT email FROM website WHERE webid='".$id."'");
$result=  mysql_fetch_assoc($add);
<--etc etc to send email-->
}
}
选择
upity.wid,
webit.email,
计数(*)作为计数
从…起
正常运行时间
加入webby网站
关于upity.wid=webby.webid
哪里
upity.time\u stamp>=DATE\u SUB(现在(),间隔10分钟)
和upity.status200
分组
upity.wid,
webit.email
计数=2
我写了一篇文章,将更详细地解释这一切是如何运作的。事实上,我写这篇文章正是为了这个原因——能够通过快速查询提供帮助,然后能够链接到正在发生的事情的详细解释

编辑:根据下面Zerkms和我之间的评论,如果你看了这段代码,一定要看一下执行时间。大型表在连接时可能会产生非常大的数据集,而且运行多个查询确实可能更高效。

$dat=mysql\u query(“选择wid,count(*)作为count
$dat=  mysql_query("SELECT wid,count(*) as count 
FROM uptime WHERE time_stamp>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) AND  status<>200 GROUP BY wid ORDER BY  time_stamp ASC");
while($ans= mysql_fetch_assoc($dat)){
if($ans['count']==2){
  $id=$value['wid'];
 $add=  mysql_query("SELECT email FROM website WHERE webid='".$id."'");
$result=  mysql_fetch_assoc($add);
<--etc etc to send email-->
}
}
从正常运行时间开始,其中时间戳>=日期子(现在(),间隔10分钟)和状态200按wid顺序分组按时间戳ASC”); 而($ans=mysql_fetch_assoc($dat)){ 如果($ans['count']==2){ $id=$value['wid']; $add=mysql_query(“从webid='“$id.””的网站中选择电子邮件”; $result=mysql\u fetch\u assoc($add); } }
$dat=mysql\u查询(“选择wid,count(*)作为计数
从正常运行时间开始,其中时间戳>=日期子(现在(),间隔10分钟)和状态200按wid顺序分组按时间戳ASC”);
而($ans=mysql_fetch_assoc($dat)){
如果($ans['count']==2){
$id=$value['wid'];
$add=mysql_query(“从webid='“$id.””的网站中选择电子邮件”;
$result=mysql\u fetch\u assoc($add);
}
}
试试这个:

$dat = mysql_query("
SELECT 
    ut.wid,ut.count(*) as count,ws.email 
FROM 
     uptime as ut 
INNER JOIN
     website as ws 
ON  
     ut.id=ws.webid  
WHERE 
     ut.time_stamp>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) AND  ut.status<>200 AND ut.count=2 
GROUP BY  
      ut.wid  
ORDER BY  
       ut.time_stamp ASC");
$dat=mysql\u查询(“
挑选
ut.wid,ut.count(*)作为count,ws.email
从…起
正常运行时间为ut
内连接
作为ws的网站
在…上
ut.id=ws.webid
哪里
ut.time\u stamp>=DATE\u SUB(现在(),间隔10分钟)和ut.status200和ut.count=2
分组
ut.wid
订购人
ut.time_stamp ASC”);
试试这个:

$dat = mysql_query("
SELECT 
    ut.wid,ut.count(*) as count,ws.email 
FROM 
     uptime as ut 
INNER JOIN
     website as ws 
ON  
     ut.id=ws.webid  
WHERE 
     ut.time_stamp>=DATE_SUB(NOW(),INTERVAL 10 MINUTE) AND  ut.status<>200 AND ut.count=2 
GROUP BY  
      ut.wid  
ORDER BY  
       ut.time_stamp ASC");
$dat=mysql\u查询(“
挑选
ut.wid,ut.count(*)作为count,ws.email
从…起
正常运行时间为ut
内连接
作为ws的网站
在…上
ut.id=ws.webid
哪里
ut.time\u stamp>=DATE\u SUB(现在(),间隔10分钟)和ut.status200和ut.count=2
分组
ut.wid
订购人
ut.time_stamp ASC”);

从删除空行开始。它几乎会将这个代码减少两倍。“我想要”-是否有一些技术要求,或者您只是“想要”它而没有任何特殊原因?PS:总共不只是两个查询。第二个将执行N次。从删除空行开始。它几乎会将这个代码减少两倍。“我想要”-是否有一些技术要求,或者您只是“想要”它而没有任何特殊原因?PS:总共不只是两个查询。第二个将执行N次。因此它是一个
JOIN
groupby
的连接。为什么它会比两个简单的查询好?@zerkms,因为它不仅仅是两个查询,而是第二个查询,可能会在循环中运行成百上千次?您可以在()中使用
webid
,这几乎是即时的。然而,
JOIN
groupby
将导致一个糟糕的执行计划。不是说这不可能,但我认为这是一个罕见的情况,在这种情况下运行许多静默会更有效。如果它是我的,并且出现了这个问题,我肯定会运行这两个程序来查看它的功能,并使用更好的选项。当然,如果他的代码现在需要2秒钟才能执行,并且一个更改使其运行20秒,那么很明显,它的效率并没有提高:)“我当然会同时运行这两个代码来查看”——确实如此。这就是为什么有必要告诉OP两个查询通常不会比一个查询更糟糕。反之亦然。我开始在这里讨论它,因为对我来说,OP显然试图执行一些“优化”,而不了解它是必需的还是值得尝试的。因此,它是一个
加入
分组方式。为什么它会比两个简单的查询好?@zerkms,因为它不仅仅是两个查询,而是第二个查询,可能会在循环中运行成百上千次?您可以在()中使用
webid
,这几乎是即时的。然而,
JOIN
groupby
将导致一个糟糕的执行计划。不是说这不可能,但我认为这是一个罕见的情况,在这种情况下运行多个quierie会更有效