Есть ли более эффективный способ сделать это

#php #mysql

#php #mysql

Вопрос:

 function countBrand($brand_id, $brand_name) {
    $sql = "SELECT brand FROM coupons WHERE expire >= CURRENT_DATE AND brand='".$brand_id."'";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);
    echo '<li>'.$brand_name.'</li>';
}

function brandCount() {
    $sql = "SELECT DISTINCT brand,brand_id,brand_name FROM coupons,coupons_brand WHERE brand=brand_id AND expire >= CURRENT_DATE ORDER BY brand_name";
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);
    $num = mysql_num_rows($result);

    echo '<h3>'.$num.' Brands</h3>';

    echo '<ul>';

    $i = 0;
    while ($i < $num) {
        $brand_id = mysql_result($result, $i, "brand_id");
        $brand_name = mysql_result($result, $i, "brand_name");
        countBrand($brand_id, $brand_name);
        $i  ;
    }

    echo '</ul>';
}
  

Он отлично работает и дает мне результаты, которые я ищу. Я не так силен в sql-операторах, как хотелось бы. Есть ли способ, которым я мог бы это сделать, который был бы более эффективным, он кажется очень медленным.

По сути, подсчитывается, сколько брендов имеют купоны, затем купоны, сколько купонов у каждого бренда..

Я также, на той же странице, делаю это для категорий. Существует несколько тысяч категорий и, возможно, 20 000 купонов.

Комментарии:

1. Не вкладывайте определения функций подобным образом. Он не делает то, что вы думаете.

2. Можете ли вы быть более понятными, чтобы я мог понять [Я понимаю функции вложенности, но он работает и делает то, что я хочу, не уверен, что было бы неправильно.].?

3. Функции, независимо от того, где они определены, существуют в глобальной области видимости. Вызов внешней функции во второй раз приведет к сбою PHP-скрипта из-за объявления внутренней функции во второй раз.

4. Ах, это имеет смысл. Внутренняя функция для cats и брендов отличается и вызывается только один раз [в этом конкретном беспорядке].

5. Я обновил код, чтобы отразить текущее исправление кода Игнасио Васкеса-Абрамса.

Ответ №1:

есть несколько оптимизаций php, которые вы могли бы сделать, но они, вероятно, не сэкономят вам много времени по сравнению с добавлением индекса в mysql для правильных столбцов

я прокомментировал некоторые оптимизации php ниже, возможно, они вас заинтересуют

учитывая простоту функций, нет необходимости иметь 2 функции, и это сэкономит время вызова countBrand() , (хотя это довольно минимальная экономия времени)

    function countBrand($brand_id, $brand_name) {
        $sql = "SELECT brand FROM coupons WHERE expire >= CURRENT_DATE AND brand='".$brand_id."'";
        $result = mysql_query($sql) || die (mysql_error()); // always check for errors

        list($brand) = mysql_fetch_row($result);

// fetch row, returns a more concise array then mysql_fetch_array
//        $row = mysql_fetch_array($result);

        // use commas rather then . when concatenating echo statements
        // dots force concatenation before output
        echo '<li>',$brand,'</li>'; 

    }

    function brandCount() {
        $sql = "SELECT DISTINCT brand,brand_id,brand_name FROM coupons,coupons_brand WHERE brand=brand_id AND expire >= CURRENT_DATE ORDER BY brand_name";
        $result = mysql_query($sql) || die(mysql_error()); // always check for errors

    //    $row = mysql_fetch_array($result); // not sure why this is needed
        $num = mysql_num_rows($result); 

        // use commas rather then . when concatenating echo statements
        // dots force concatenation before output
        echo '<h3>',$num,' Brands</h3>';

        echo '<ul>';

      // fetch all cols at once, rather then using lots of separate calls to mysql_result
      // use mysql_fetch_row as it returns just the ordered values (vs mysql_fetch_assoc, and mysql_fetch_array)
      // 
       while(list($brand, $brand_id, $brand_name) == mysql_fetch_row($result)) {
            countBrand($brand_id, $brand_name);
       }

      // replaced with while loop above
      //  $i = 0;
      //  while ($i < $num) {
      //      $brand_id = mysql_result($result, $i, "brand_id");
      //      $brand_name = mysql_result($result, $i, "brand_name");
     //       countBrand($brand_id, $brand_name);
      //      $i  ;
        }

        echo '</ul>';
    }
  

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

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

 SELECT brand, brand_id, brand_name, COUNT(*) as brandcount
FROM coupons
JOIN coupons_brand ON brand=brand_id 
WHERE expire >= CURRENT_DATE 
GROUP BY brand, brand_id, brand_name
ORDER BY brand_name
  

Комментарии:

1. ВАУ, бампербокс… Просто ВАУ. Благодаря предоставленной вами информации [ВАУ] я могу делать все необходимое НАМНОГО быстрее. Я не могу начать благодарить вас за ваше время и внимание. Удивительный ответ… Я благодарю вас, спасибо, спасибо….

Ответ №2:

mysql_fetch_array($result,MYSQL_ASSOC);

 SELECT SQL_CACHE brand FROM
  

Запрос профилирования

Комментарии:

1. Спасибо за ваш ответ Userpassword.