2013-09-12 4 views
1

может кто-нибудь помочь мне уменьшить этот код.оптимизация запроса в одном

$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--> 
    } 
} 

мне нужно уменьшить код, пожалуйста, помогите me.if двух запросов могут быть объединены без потери смысла также будет полезно для меня.

+1

Начните с удаления пустых строк. Он почти уменьшит этот код дважды. – zerkms

+1

«Я хочу» --- есть ли какое-то техническое требование, или вы просто «хотите» его без какой-либо конкретной причины? – zerkms

+0

PS: всего 2 запроса. Второй будет выполняться N раз. – zerkms

ответ

1

Это простое соединение между двумя таблицами:

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 

Я написал really in-depth Q&A on joining tables in SQL, который будет объяснять много более подробно, как это все работает. Фактически, я написал это именно по этой причине - смогу помочь с быстрым запросом, а затем уметь ссылаться на подробное объяснение того, что происходит.

Редактировать: Согласно комментариям ниже между Zerkms и мной, если вы берете этот код, посмотрите время выполнения. Большие таблицы могут привести к очень большим наборам данных при объединении, и действительно возможно, что выполнение нескольких запросов может быть более эффективным.

+0

Так что это 'JOIN' с' GROUP BY'. Почему это было бы лучше, чем два тривиальных запроса? – zerkms

+0

@zerkms Потому что это не только два запроса, но второй запрос, который потенциально может запускаться сотни/тысячи раз внутри цикла? – Fluffeh

0
$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--> 
} 
} 
0

Попробуйте один:

$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"); 
Смежные вопросы