Saklı işlemin sonuna kadar bir döngü

5 Cevap php

I am trying to write a procedure that will fire the same select query till the number of results are more than 0. If the "interval 2 hour " returns 0 records then the "interval 4 hour" criterion should be used and if there are still no records fetched, then lastupdate > current_date() should be used in the where clause.

Bu prosedürde kullanılan 2 temel sorgular.

select sql_calc_found_rows id from sometable where lastupdate > date_sub(now(), interval 2 hour) limit 10;

select found_rows();
+--------------+
| found_rows() |
+--------------+
|           41 | 
+--------------+

Aşağıdaki yordam doğru mu? Bir SP yazmak için doğru yolu nedir? Ve nasıl bir PHP kodu sonuçlarını kullanabilirim?

delimiter $$
create procedure mytest3()
begin 

  declare myvar int;

 select sql_calc_found_rows id 
   from sometable 
  where lastupdate > date_sub(now(), interval 2 hour) 
  limit 10;

 select found_rows() into myvar;

if (myvar > 0) 
  then select 'Found in 2 hours';
else
  select sql_calc_found_rows id 
    from sometable 
   where lastupdate > date_sub(now(), interval 4 hour) 
   limit 10;

select found_rows() into myvar;

if (myvar > 0) 
  then select 'Found in 4 hours';
else 
  select sql_calc_found_rows id 
    from sometable 
   where lastupdate > current_date() 
   limit 10;
end if;
end if; 
end$$

5 Cevap

Sizin durumunuza bağlı olarak, bu veritabanı üzerinde (http://dev.mysql.com/doc/refman/5.0/en/triggers.html), bir tetikleyici kurmak için daha iyi olabilir. Bu gerekli çalışma / recalculations yapmanızı sağlar sadece yerine veritabanında hiçbir şey değişmedi bile sürekli sorgulayarak sunucu gereksiz yere meşgul yapma ilgili veri değişiklikleri,.

Bu sizin metnin başlığı ve beden hem de bir döngü için sordunuz yaparken, ne gerçekten yapmak için çalışıyoruz küçük X, "Son X saat modifiye satır" listesini almak olduğunu bana oluşur hangi satırların bazıları (boş olmayan) kümesi döndürür ...

İşte o ulaşmanın bir yolu:

delimiter $$
create procedure recently_modified_rows()
begin 

  declare tablelastupdate int; -- how many hours ago table was last updated.
  declare showperiod datetime; -- what time interval to show
  declare showtext  text;      -- text describing time interval

  select hour(timediff(now(), max(lastupdate))) into tablelastupdate
    from sometable;

  if(tablelastupdate < 2)
     set showperiod = time_sub(now(), interval 2 hours);
     set showtext = "modified in the last 2 hours";
  elseif (tablelastupdate < 4)
     set showperiod = time_sub(now(), interval 4 hours);
     set showtext = "modified in the last 4 hours";
  else
     set showperiod = current_date();
     set showtext = "modified today";
  end if

  select sql_calc_found_rows id, 
         showtext description
     from sometable 
     where lastupdate > showperiod 
     limit 10;

end$$

ve php onu aramak için:

$query = mysql_query("call recently_modified_rows()") or die( mysql_error() );
$numrows = mysql_numrows($query);

if ($numrows != 0)
{
    /* print out what time interval we used */
    $description = mysql_result($query, 0, 'description');
    echo "Found $numrows rows $description";

    /* print out the rows */
    while ($row = mysql_fetch_array($query)) 
    {
       echo "Id: {$row['id']}";
    }

}
else 
{
    /* happens only if there were no records modified in any of the three versions */
    echo "no records were modified in the last 2 hours, 4 hours, or today";
}

Bu StackOverflow bir cevap yazabilmek benim ilk denemem. Bu faydalı olur ..

Benim yerel MySQL veritabanı kullanılarak aşağıda bir test prosedürü yazdım. Bu 10 tam saniye çalışacak ve herhangi bir kayıt varsa boş bir resultset dönmek için ayarlanır. Bir satır o çalışıyor on saniye içinde takılırsa, bu döngü çıkmak ve yeni sonuçları dönecektir.

Uyku fonksiyonu çalışır durumdayken saniyede sadece bir kez Select Count (*) çalıştırarak çok fazla CPU yeme işlemi önlemek için vardır. İstediğiniz herhangi bir zaman aralığı için bu ayarlayabilirsiniz.

Bu prosedür iyi çalışır, ben yerine Triggers kullanarak natevw ile anlaşmak zorunda.

 DELIMITER $$

 CREATE PROCEDURE sp_TestQueryResultsTimeout()
 BEGIN


   DECLARE v_interval, ct, v_time INT;

   /* This will keep track of how much time has passed*/
   SET v_interval = 0;

   /* This is used for comparing the rowcount*/
   SET ct = 0;

   /* This is used to keep the procedure from returning the Sleep functions results'
      This could also be used to keep a more accurate count of the amount of Sleep time has passed by adding the results of the sleep function to it on every iteration*/
   SET v_time = 0;

   /* This while statement should run for slightly longer than ten seconds
      The amount of extra time will begin to add up depending on how long the select count (*) takes
      and how many iterations you want to make'*/

   WHILE v_interval < 10 DO

   /*Get the count from your table*/
       SET ct = (SELECT count(*) FROM tbUsers);

     /*If the count is greater than 0, exit the while by satisfying the condition*/
   if (ct > 0) then
    SET v_interval = 10;
   else
    /*If the count is less than 0, sleep for 1 second*/
         SET v_time = (SELECT SLEEP(1));
   end if;

       /*Increment*/
       SET v_interval = v_interval + 1;
   END WHILE;

   SELECT * FROM tbUsers;

 END$$

 DELIMITER ;

MySQL docs:

CREATE PROCEDURE dowhile()
BEGIN
  DECLARE v1 INT DEFAULT 5;

  WHILE v1 > 0 DO
    ...
    SET v1 = v1 - 1;
  END WHILE;
END

Birinin sonucu görüntüler o sayfayı, açılana kadar veritabanına sonucu kaydetmek zorunda böylece PHP sayfaları, kullanıcılar tarafından tetiklenir.

Bunun yerine veritabanı içinde sonsuz bir döngü kullanarak, bir PHP cronjob kullanabilirsiniz.