Каталог фирм: каким способом можно посчитать кол-во фирм находящихся в n-регионе?

R34-zevs
На сайте с 15.07.2006
Offline
238
601

Сейчас подсчет осуществляется по следующего алгоритму:

$query = $db->query("SELECT regid FROM ".DB_PREFIX."_region");
while($result = $db->fetch_object($query))
{
$num_last = $db->result("SELECT COUNT(*) FROM ".DB_PREFIX."_catalog WHERE regid='".$result->regid."'");//скок всего позиций
$db->query("UPDATE ".DB_PREFIX."_region SET counter='".$num_last[0]."' WHERE regid='".$result->regid."' ");
}
".DB_PREFIX."_region300 городов


<<< ".DB_PREFIX."_catalog

5000 фирм

каждая фирма имеет свой город

Каким еще способом можно посчитать количество фирм находящихся в конкретном городе?

Агентство недвижимости Фабрика Жилья (http://xn--80aacvicll3bzbzgqb.xn--p1ai/)
bay_ebook
На сайте с 28.05.2010
Offline
111
#1

Ну примерно как то так (полей всех не знаю, посему поля наугад)

$db->query("SELECT `r`.`regid`, COUNT(`c`.`id`) AS `countregion` FROM `".DB_PREFIX."_region` AS `r` LEFT JOIN `".DB_PREFIX."_catalog` AS `c` ON `c`.`regid` = `r`.`regid` GROUP BY `r`.`id`");
Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
R34-zevs
На сайте с 15.07.2006
Offline
238
#2
$query = $db->query("
SELECT
r.regid, COUNT(c.cataid) AS countregion
FROM
".DB_PREFIX."_region AS r LEFT JOIN
".DB_PREFIX."_catalog AS c ON (c.regid = r.regid)
GROUP BY r.regid");

while($result = $db->fetch_object($query))
{
$db->query("UPDATE ".DB_PREFIX."_region SET counter='".$result->countregion."' WHERE regid='".$result->regid."' ");
}
/////////////////////////////////подсчет городов////////////////////////
$query = $db->query("
SELECT
r.regid, COUNT(c.cataid) AS countregion
FROM
".DB_PREFIX."_region AS r LEFT JOIN
".DB_PREFIX."_catalog AS c ON (c.cityid = r.regid)
GROUP BY r.regid");

while($result = $db->fetch_object($query))
{
$db->query("UPDATE ".DB_PREFIX."_region SET counter='".$result->countregion."' WHERE regid='".$result->regid."' ");
}

У нас идет подсчет сначало по полю регионов (т.е. областей), затем по полю города.

К примеру поле regid у таблицы catalog - заполнено всегда, а поле cityid в таблице catalog иногда бывает ноль.

Каким образом можно объеденить это в единый запрос, чтоб одновременно шел подсчет и по областям и по городам.

bay_ebook
На сайте с 28.05.2010
Offline
111
#3
R34-zevs:

А нельзя как-то оптимизировать UPDATE?

Вы бы стразу задачу ставили правильно :)

$db->query(" UPDATE `region` AS `r` SET `counter` = (SELECT COUNT(*) FROM `catalog` AS `c` WHERE `c`.`regid` = `r`.`regid`) ");

Писал на коленке, нада проверить

ПС не ленитесь использовать ` и AS - очень полезно, поверите :)

А в вашем 2-м варианте - нужно использовать LIMIT 1 для ускорения.

Забыл спросить - индексы выставлены?

R34-zevs
На сайте с 15.07.2006
Offline
238
#4

bay_ebook, Спасибо Вам огромное, все работает, очень помогли!!!

---------- Добавлено 18.07.2013 в 16:11 ----------


$db->query("
UPDATE
`".DB_PREFIX."_region` AS `r`
SET
`counter` = (SELECT COUNT(*) FROM `".DB_PREFIX."_catalog` AS `c` WHERE `c`.`regid` = `r`.`regid`) ");

//подсчет городов
$db->query("
UPDATE
`".DB_PREFIX."_region` AS `r`
SET
`counter` = (SELECT COUNT(*) FROM `".DB_PREFIX."_catalog` AS `c` WHERE `c`.`cityid` = `r`.`regid`) ");

а можно как-то вот это объединить в один запрос?? Чтоб сразу шел подсчет и по полю regid и по полю cityid.В качестве помощи есть следующая закономерность. Длина всех regid=2 (например 11 или 12), а длина всех cityid=4 (например 1110 или 1210)

bay_ebook
На сайте с 28.05.2010
Offline
111
#5
R34-zevs:

а можно как-то вот это объединить в один запрос?? Чтоб сразу шел подсчет и по полю regid и по полю cityid.В качестве помощи есть следующая закономерность. Длина всех regid=2 (например 11 или 12), а длина всех cityid=4 (например 1110 или 1210)

Я думал, это уже будет очевидно :)


$db->query("
UPDATE
`".DB_PREFIX."_region` AS `r`
SET
`counter` = ((SELECT COUNT(*) FROM `".DB_PREFIX."_catalog` AS `c` WHERE `c`.`regid` = `r`.`regid`) + (SELECT COUNT(*) FROM `".DB_PREFIX."_catalog` AS `c2` WHERE `c2`.`cityid` = `r`.`regid`))

");
R34-zevs
На сайте с 15.07.2006
Offline
238
#6

bay_ebook, Спасибо))

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий