Эффективность кода для организации значений из базы данных - PullRequest
0 голосов
/ 12 ноября 2009

Я должен поместить данные своей базы данных в этот формат (значения будут отличаться, очевидно), я думаю, что это называется ассоциативный массив (я ужасен с терминологией).

$values=array(
            "Jan" => 110,
            "Feb" => 130,
            "Mar" => 215,
            "Apr" => 81,
            "May" => 310,
            "Jun" => 110,
            "Jul" => 190,
            "Aug" => 175,
            "Sep" => 390,
            "Oct" => 286,
            "Nov" => 150,
            "Dec" => 196
    );

Вот что я разработал:

    $sql = "SELECT MONTH(AddDate) AS Date, column_name FROM table ORDER BY AddDate ASC";
    $res = mysql_query($sql) or die(mysql_error());
    $prev_date = null;

$values=array();

while ( $row = mysql_fetch_assoc($res) ) {
    if ( $row['Date'] != $prev_date) {
        $month = $row['Date'];
        $sql = "SELECT count(MONTH(AddDate)) AS EntryAmount FROM `table` WHERE MONTH(AddDate)=$month ";
        $countResults = mysql_query($sql) or die(mysql_error());
        if( $entryAmount = mysql_fetch_array($countResults) ) {
            $values[$row['Date']] =  $entryAmount['EntryAmount'];
        }
        $prev_date = $row['Date'];
    }
}

Выход:

Array ( [9] => 999 [10] => 986 [11] => 264 ) 

Ответы [ 2 ]

5 голосов
/ 12 ноября 2009

Вы можете сделать все это одним запросом:

select month(AddDate) as theMonth,
       count(*) as numberOfRows
from   `table`
group by theMonth
order by theMonth

Тогда внешний цикл исчезает, а внутренний цикл становится:

if( $row = mysql_fetch_array($results) ) 
{
    $values[$row['theMonth']] = $row['numberOfRows'];
}

Он должен работать заметно лучше для наборов данных среднего размера. Однако обратите внимание, что при использовании функции month вы теряете все преимущества индексов, которые вы могли бы использовать в противном случае.

0 голосов
/ 12 ноября 2009

с использованием GROUP BY (не проверено):

$sql = "SELECT MONTH(AddDate) AS Date, count(AddDate) AS EntryAmount FROM table ORDER BY AddDate ASC GROUP BY MONTH(AddDate)";
$res = mysql_query($sql) or die(mysql_error());
$values=array();

while ( $row = mysql_fetch_assoc($res) ) {
    $values[$row['Date']] =  $row['EntryAmount'];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...