Осуществление запроса к БД при помощи цикла от 50 до 300 раз. Допустимо и нормально?

Гриша К.

Новичок
Осуществление запроса к БД при помощи цикла от 50 до 300 раз. Допустимо и нормально?

Здравствуйте.
Есть функция извлечения данных (одна строка не больше 50 символов) из БД (get_country_world($countryiso)).
Есть цикл (foreach), который использует эту функцию, цикл пвоторяется в основно до 50 раз, но может быть и до 300, т.е. выполнение данной функции и соотвествующего запроса к БД осуществляется 50 раз (может быть 300).

Мне не приходилось, использовать запрос к БД, столько раз подряд, скажите пожалуйста допустимо ли такое обращение к БД, не перегрузит ли это ее, вообще используется ли запрос к БД в больших кличествах, например 50 - 300.
Все думаю оставлю так, а так нельзя, перегруз или еще что (а по другому блин никак не получается).

PHP:
	foreach ($city_array as $key => $value)  {
		$countryiso = strtolower($value['countryiso']);
		$worldid = strtolower(get_country_world($countryiso));

		}

	function get_country_world($countryiso)
	{
	global $lang;

	$conn = db_connect();  
	$query = "select worldid
		from countries
		where countryiso = '".mysql_real_escape_string($countryiso)."'"; 
	$result = @mysql_query($query);
	if (!$result)
		return false;
	if (@mysql_num_rows($result) == 0)
		return false;  
	$result = mysql_result($result, 0, 'worldid');
	return $result;  
	}
Просто попробовал вывести 2013 записей таким образом, т.е. обращений к БД (выполнение запроса) 2013 раз, выполнялось на домашнем компьютере 3,5 секунды (600 КБ - страница). Вроде бы могу использовать такой вариант, ну только для 50 записей (иногда до 300). Просто хочется услышать мнени опытных программситов и тогда будет споконо, а если так нельзя придется что-то придумывать.
P.S. пойду лягу спать пока.
 

Andreika

"PHP for nubies" reader
Гриша К.
базы данных существа очень ранимые... по 2-3 запроса на скрипт, не больше - иначе они обижаются

>а по другому блин никак не получается
ну а че тогда мучаешся ЭТИМ вопросом, если все равно по другому не получается?
можно еще не по одной вытаскивать, а по несколько или тему "использования worldid в цикле" раскрыть
 

ZN

Новичок
Andreika
>базы данных существа очень ранимые... по 2-3 запроса на скрипт, не больше - иначе они обижаются
ты это сам придумал? или у тебя база, которую ты сам писал?
Гриша К.
а почему бы вам не сделать один запрос, который вернёт вам эти n строк?
 

Гриша К.

Новичок
Спасибо все за ответы.
Есди это не нормально, то буду искать другой способ.
Я думаю по описанному коды смысл извлечения понятен, и вот как его по другому сделать, я никак не придумаю.
Одним запросом я не могу это сделать, потому что массив
$city_array - это результат объединения 2-х других таблиц при помощи left join:
$query = "select cities.countryiso, cities.cityid, orders.status
from cities left join orders
where cities.cityid = orders.cityid"

Если только get_country_world($countryiso), извлеч массивом и сним как возится.
А нельзя ли объдинять массивы как таблицы в БД?
 

kvf77

Red Devil
Гриша К.

гм - а нельзя использовать IN в запросе с полным переченм из city_array?
 

Гриша К.

Новичок
kvf77, а у меня на хостинге Mysql 4.0...
Подзапросы помойму доступны только с версии 4.1.
Вообще конечно с подзапросами очень удобно. Я щас буду искать хостинг для нового проекта, там гед много места (Гигабайт 20, минимум) и сразу буду смотреть какая версия Mysql.

Я вот такое решение нашел:
В функции get_country_world($countryiso)
делаю такой запрос:
PHP:
	$query = "select DISTINCT countries.worldid, countries.countryiso
		from countries, cities
		where countries.countryiso = cities.countryiso and cities.city like '$text%'";
Затем делаю такой цикл:
PHP:
	$country_array = get_country_world($text);
	foreach ($country_array as $key => $value) {
		$countryiso = strtolower($value['countryiso']);
		$worldid_[$countryiso] = strtolower($value['worldid']);
	}

А уже в цикле
foreach ($city_array as $key => $value)  { 
        $countryiso = strtolower($value['countryiso']); 
        $worldid = $worldid_[$countryiso]; 
        }
извлекю нужное значение из массива $worldid_[]

Скажите пожалуйста, вот у меня получается что оба массива к примеру содержат по 300 строчик, в одно массиве строчка из 5 символов, в другом максимум 50 (в среднем 10).
Является ли это очень большим массивом и например если бы был только один массив то нагрузка была бы в 2 раза меньше?
Или это нормальное явление для массивов и у вас они бывают гораздо больше?
 

Andreika

"PHP for nubies" reader
PHP:
foreach ($city_array as $key => $value)  {  
        $countryiso = strtolower($value['countryiso']);  
        $worldid = $worldid_[$countryiso];  
        }
а ты не думал, что в этом коде последняя строчка как бы вообще без смысла?
 

Фанат

oncle terrible
Команда форума
Одним запросом я не могу это сделать, потому что массив
$city_array - это результат объединения 2-х других таблиц при помощи left join:
а какая проблема сделать ещё один джойн?
 

Гриша К.

Новичок
Andreika, почему без смысла, мне же нужно извлеч из БД значение 'worldid' из таблицы "countries", соответсвующее значению 'citiyd' в таблице "cities", где countries.countryiso = cities.countryiso (но объединить эти две таблицы я немогу, потому что одна из них объединяется с другой left join),

Может быть я плохо объяснил задачу и вы меня не поняли, или я вас щас просто не понимаю, вот приведу такой код, который возможно пояснит суть таких извлечений. А вы не могли бы пояснить ваш вопрос, если я всетаки не понял вас?
PHP:
foreach ($city_array as $key => $value)  {   
        $countryiso = strtolower($value['countryiso']);   
        $worldid = $worldid_[$countryiso];
        $cityid =  strtolower($value['cityid']);
        $city =  $value['city'];
        echo <a href="page.php?world='.$worldid.'&country='.$countryiso.'&city='.$cityid.'">$city</a>    
        }
 

kvf77

Red Devil
Гриша К.
слушай я тя каша вголове помоему - по-русски объясни:
1) есть таблица 1, 2, 3
2) первая со второй линкуется по такому полю
3) из третьей надо такое поле, оно линкуется по такому-то параметру

а то слов много - а кто с кем не понять
 

Andreika

"PHP for nubies" reader
Гриша К.
мож мы друг друга не поняли, но код ты привел нужный )
вот тока не пойму что там за ссылка получается, что по ней будет и почему в ней столько много переменных... вроде бы city по логике должен иметь уникальный id и все %)
 

Гриша К.

Новичок
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Фанат, и kvf77
попробую обосновать такие решения:

Есть таблица (в кратце):
orders(worldid, countryiso, cityid, status);

Дальше таблицы (в кратце) - справочники частей света, стран и городов (каждая на 2-х языках, поэтому они не объеденены, так как столбцы с языками будут пополняться):
part_world(wordlid);
countries(worldid, countryiso);
city(countryiso, cityid, city);

Сначала я извлекаю все записи (вместе с NULL) при помощи left join из таблицы "cities" и "orders", для того, чтобы потом отображать записи ('city') в зависимости от 'status' в таблице "orders" (к примеру если поле 'status' не пустое, то отображаю синим цветом, если оно пустое или равно 0 или 2, то черным):
PHP:
$language = 'rus';

$query = "select cities.countryiso, cities.cityid, cities.city$language, orders.status
from cities left join orders
where cities.cityid = orders.cityid;"
Но мне нужно вывести записи таким образом:
<a href="page.php?world='.$worldid.'&country='.$countryiso.'&city='.$cityid.'">$city</a>
т.е. мне нужно еще значение 'worldid' из таблицы "countries", поэтому я извлека из таблицы "countries" и "cities", значение 'world'
PHP:
$query = "select DISTINCT countries.worldid, countries.countryiso 
        from countries, cities 
        where countries.countryiso = cities.countryiso and cities.city like '$text%'";
А потом делаю как описал здесь (выше)http://phpclub.ru/talk/showthread.php?postid=592692#post592692

Я вот щас подумал, может быть Фанат вы имеете в виду, что я могу извлеч данные при помощи Lefr join сразу из 3-х таблиц, как еслибы:
PHP:
$query = "select *
                 from countries, cities, orders
                 where countries.countryiso = cities.countryiso and cities.cityid = orders.cityid"
-~{}~ 23.03.06 16:09:

Andreika,
вот така ссылка <a href="page.php?world='.$worldid.'&country='.$countryiso.'&city='.$cityid.'">$city</a>, формируется для того, что наследующей странице данные извлекаются в зависимости от всех 3-х переменных, ну тут кончено понять что я делаю очень сложною

====================

Да посли моего поянения ответом больше нету. Ну главное, что вообще вариант с 2 массивами по 300 записей приемлем, и все. Спасибо все за ответы.
Единственное, что если можно объединять больше 2-х таблиц при помощи left join, то напишите пожалуйста пример.


-~{}~ 23.03.06 16:45:
 

kruglov

Новичок
больше двух таблиц объединять можно

select ... from orders
left join cities on orders.city=cities.id
left join countries on cities.country=countries.id
 

Гриша К.

Новичок
kruglov, спасибо большое.
Я сам пробовал делать, но не так:
select ... from orders
left join cities on orders.city=cities.id,
orders left join countries on cities.country=countries.id

Поэтому ничего и не получалось, а в книге (MySQL справочник по языку) нет таких примеров, только для 2-х таблиц.
Ну в таком случае решение моей задачи, совсем простое. Уже сделал так.
 

alexhemp

Новичок
Гриша К.

Вы бы не книгу читали а мануал по MySQL. Заодно английский подтянете - тоже полезно.
 

Гриша К.

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

TheBattle

Новичок
Для начала:
manual
1) руководство; описание; справочник; учебник "The manuals contained a basic version of the system calls that was good enough to help me get by" (Linus Torvalds) — В документации нашлось описание базовой версии системных вызовов - для начала мне этого было достаточно
----------------------
Насчёт английского языка - в достаточно крупных проектах всегда есть переводы мануалов, в рунете можно поискать, иногда находятся добровольцы, что переводят это дело (я вот всё не дождусь, когда все RFC переведут)
Вот здесь все говорят - учи английский, ага, как всё просто, взял и выучил "от сих до сих", конечно.
На самом деле можно выучить лишь пару сотен слов, чтобы разбираться в этих чёртовых английских технических документах, мануалах, документациях. И грамматику подтянуть немного, чтобы во временах не путаться, а так, когда говорят презренно "иди, учи английский", забивай на такие высказывания. Надо будет - подучишь. Думаю, мало есть таких людей, которые хорошо знают этот язык. Быть может, мануал могут хорошо понимать, а вот какой-нибудь замутный текст, выдранный с нетехнического сайта - это уж вряд ли без словаря (да и со словарём тоже) хорошо поймут.

Мануал по 4-й версии, русский, лежит здесь:
http://downloads.mysql.com/docs/refman-4.0-ru.html-chapter.zip
По 5-й версии только английский.
 

Гриша К.

Новичок
baev, спасибо большое за ссылки.
Ну значит моя книга тоже манула.
Называется она:
---------------------------
| MySQL
| Спарвочник по языку
|
|Официальное руководство по языку и API-интерфейсам MYSQL
| Компания MySQL AB
|-------------------------


TheBattle, спасибо большое за разъяснение и за ссылку.
По поводу английского, в ыпервый кто размышляет с моей точки зрения целесообразно.
Мне уже раз 5 писаль выучи английский, или пока не выучиш английский не занимайся программированием и т.д.
В этом отношении я не с кем не согласен, кроме вас.
 
Сверху