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会更有效