Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] Optymalizacja
Forum PHP.pl > Forum > Przedszkole
kkuba
Witam.

Zauważyłem, że mój cms 'w spoczynku' wykonuje 13 zapytań. Ta liczba wydała mi się dość duża, więc zastanawiam się nad połączeniem co niektórych zapytań.
Mam jedną funkcję, pobierającą ogólne statystyki strony z bazy

  1. <?php
  2. function getStats()
  3.    {
  4.        $d = date('d');
  5.        $m = date('m');
  6.        $y = date('Y');
  7.        
  8.        $count = 0;
  9.    
  10.        $res = sql_query('SELECT COUNT(`id`) FROM `users`');
  11.            $res = mysql_fetch_row($res);
  12.            $stats['users'] = (isset($res[0]) && $res > 0) ? $res[0] : '0';
  13.  
  14.        $res = sql_query('SELECT COUNT(`id`) FROM `topics`');
  15.            $res = mysql_fetch_row($res);
  16.            $stats['topics'] = (isset($res[0]) && $res > 0) ? $res[0] : '0';
  17.            
  18.        $res = sql_query('SELECT COUNT(`id`) FROM `posts`');
  19.            $res = mysql_fetch_row($res);
  20.            $stats['posts'] = (isset($res[0]) && $res > 0) ? $res[0] : '0';
  21.        
  22.        $res = sql_query('SELECT `count` FROM `visits` WHERE `day`="'. $d .'" AND `month`="'. $m .'" AND `year`="'. $y .'" LIMIT 1');
  23.            $res = mysql_fetch_row($res);
  24.            $stats['vtoday'] = (isset($res[0]) && $res > 0) ? $res[0] : '0';
  25.        
  26.        $res = sql_query('SELECT `count` FROM `visits` WHERE `month`="'. $m .'" AND `year`="'. $y .'"');
  27.            while($tmp = mysql_fetch_row($res))
  28.            {
  29.                $count += $tmp[0];
  30.            }
  31.            $stats['vmonth'] = ($count > 0) ? $count : '0';
  32.            $count = 0;
  33.        
  34.        $res = sql_query('SELECT `count` FROM `visits`');
  35.            while($tmp = mysql_fetch_row($res))
  36.            {
  37.                $count += $tmp[0];
  38.            }
  39.            $stats['vall'] = ($count > 0) ? $count : '0';
  40.  
  41.        return $stats;
  42.    }
  43. ?>


Jak widać, mały nieporządek :F
I pytanko.. można te zapytania w jakiś sposób połączyć?

Z początku próbowałem UNION'ować, ale gdy jeden wynik był pusty, to pozostałe przesuwały się 'w górę'.

Pozdrawiam.
nospor
pierwsze 3 laczysz w union. nic tam ci sie nie przesunie
co do pozostalych: o sum() w mysql slyszal?
kkuba
Załóżmy, że users = 5, topics = 2, posts = 4 - jest ok, wszystko się wyświetla.

Gdy jednak w bazie nie ma ani jednego tematu i 0 postów, wtedy te liczby nie są wyświetlane. Zamiast nich.. nie ma nic, po prostu.

A o sum() idę czytać, dzięki ; p
nospor
bo domyslnie union usuwa duplikaty, a ze tobie pojawią sie 3 zera, to zostaje tylko jedno.
musisz uzyc union all
http://dev.mysql.com/doc/refman/5.0/en/union.html
kkuba
UNION ALL.. o tym też nie słyszałem >.<
Super działa, wielkie dzięki.

Jeszcze pytanko, czy da się te zapytania

  1. <?php
  2. $res = sql_query('SELECT `count` FROM `visits` WHERE `day`="'. $d .'" AND `month`="'. $m .'" AND `year`="'. $y .'" LIMIT 1');
  3.            $res = mysql_fetch_row($res);
  4.            $stats['vtoday'] = (isset($res[0]) && $res > 0) ? $res[0] : '0';
  5.        
  6.        $res = sql_query('SELECT SUM(`count`) FROM `visits` WHERE `month`="'. $m .'" AND `year`="'. $y .'"');
  7.            $res = mysql_fetch_row($res);
  8.            $stats['vmonth'] = ($res[0] > 0) ? $res[0] : '0';
  9.        
  10.        $res = sql_query('SELECT SUM(`count`) FROM `visits`');
  11.            $res = mysql_fetch_row($res);
  12.            $stats['vall'] = ($res[0] > 0) ? $res[0] : '0';
  13. ?>


połączyć? ; p

Próbowałem też unionować, to po przypisaniu w pętli while wszystkich wyników do tablicy, print_r wypluło tylko ilość userów, nic więcej.
nospor
pokaz jak to uniowales
kkuba
  1. SELECT COUNT(`id`) FROM `users` UNION ALL SELECT COUNT(`id`) FROM `topics` UNION ALL SELECT COUNT(`id`) FROM `posts` UNION ALL SELECT `count` FROM `visits` WHERE `day`="'. $d .'" AND `month`="'. $m .'" AND `year`="'. $y .'" LIMIT 1
nospor
hehe, poczytaj w linku co ci podalem o pewnych zasadach. Jedną z nich jest umiejetne korzystanie z nawiasów winksmiley.jpg
kkuba
yay, 5 zapytań mniej : d

Wielkie dzięki, jeszcze raz ; p
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.