#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:
Комментарии:
1. Спасибо за ваш ответ Userpassword.