[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Минимум 10 обращений к БД
Varyag666
Здравствуйте! Сделал скрипт, но есть одна проблема, я в цикл поместил запрос к БД, цикл будет выполняться не менее 9ти раз для выборки информации(select) и вывода ее на экран

Как скажется такое количество запросов на быстродействии если страницу будет просматривать 50человек? Это много запросов или нормально?

Андрей



Спустя 6 минут, 5 секунд (24.11.2009 - 08:07) twin написал(а):
Запрос в цикле - уже не нормально. А вообще все зависит ои "пропускной возможности" сервера.
50 человек одновременно? Или в день? Или в месяц?

Спустя 2 минуты, 1 секунда (24.11.2009 - 08:09) Varyag666 написал(а):
одновременно, я понимаю что в цикле это не нормально, по другому мозгов не хватает пока

Спустя 1 час, 1 минута, 49 секунд (24.11.2009 - 09:11) Argnist написал(а):
используй JOIN в запросе, а если не знаешь как, пиши сюда че пытаешься сделать, а не теорию

Спустя 1 час, 2 минуты, 45 секунд (24.11.2009 - 10:14) Varyag666 написал(а):
БД mysql.
Делаю доску объявлений, есть две таблицы
CREATE TABLE kategory(
id_kategory int(6) NOT NULL auto_increment,
name varchar(30) NOT NULL default '',
id_images int(6) NOT NULL default '1',
positions int(2) NOT NULL,
PRIMARY KEY (id_kategory)
)
ENGINE=InnoDB CHARACTER SET=UTF8;
CREATE TABLE podkategory(
id_podkat int (6) NOT NULL auto_increment,
name_kat varchar (50) NOT NULL default '',
id_kategory int (6) NOT NULL,
PRIMARY KEY (id_podkat),
FOREIGN KEY(id_kategory) REFERENCES kategory(id_kategory)
)
ENGINE=InnoDB CHARACTER SET=UTF8;


В одной категории, в другой подкатегории, хочу вывести все это на первую страницу доски для навигации, вот код с циклом

mysql_connect($host_name,$user_name,$password);
mysql_select_db($db_name);
$array=array();//в этот массив поместятся номера категорий
$sql="SELECT id_kategory FROM kategory ORDER BY positions ASC"; //запрос для извлечения номеров категорий, упорядочивание по позиции
$bufer=mysql_query($sql);
//создаем массив из номеров категорий
while($mass=mysql_fetch_assoc($bufer)){
foreach ($mass as $key=>$val){
array_push($array,$val);
}}
//переходим в начало массива
reset ($array);
//теперь его перебираем и формируем главную страницу доски объявлений
while (list ($key,$val) = each ($array)){
$n=$val;//эта переменная для запросов, она равна элементу массива
//выводим нашу доску объявлений, вот здесь куча запросов

$sql = "SELECT kategory.name,podkategory.name_kat
FROM kategory,podkategory
WHERE kategory.id_kategory = podkategory.id_kategory
AND podkategory.id_kategory=
$n";
$bufer=mysql_query($sql);
$i=0;//для извлечения категории
while($mass=mysql_fetch_array($bufer)){
if($i==0){ //категория
echo "<b>$mass[0]</b><ul>
<li>
$mass[1]</li>";
$i++;
} else { //подкатегория
echo "<li>$mass[1]</li>
"
;
}}
echo "</ul>";}


Он все делает как мне надо, количество циклов зависит от количества категорий, если их 9 то будет 9 циклов и соответственно 9 запросов(я молчу про первый запрос)

Возможно БД не правильно сделал?

Спустя 28 минут, 8 секунд (24.11.2009 - 10:42) Kuliev написал(а):
Varyag666
я в шоке blink.gif

Спустя 1 минута, 33 секунды (24.11.2009 - 10:44) Семён написал(а):
SELECT *
FROM kategory
LEFT JOIN podkategory
ON kategory.id_kategory=podkategory.id_kategory

Спустя 27 минут (24.11.2009 - 11:11) Kuliev написал(а):
Varyag666

Вот посмотри, покрути...


function pod_cat($id)
{
$sql = "SELECT *
FROM `cat`, `p_cat`
WHERE `cat`.`id_cat` = `p_cat`.`id_cat`
AND `p_cat`.`id_cat` = "
.intval($id)."";
$result = mysql_query($sql) or die (mysql_error() ."<br/>". $sql);

$str = "<ul>\n";

while($row = mysql_fetch_assoc($result))
{
$str .= "<li><a href=index.php>".$row['name']."</a><br/>\n";
}

$str .= "</ul>\n";

return $str;


}

// Определяем переменную ID для дальнейшей работы
$id = isset($_GET['id']) ? $_GET['id'] : null;

// Пишим запрос на выборку категорий
$sql = "SELECT *
FROM `cat`"
;
$result = mysql_query($sql) or die (mysql_error() ."<br/>". $sql);

echo "<ul>\n";

while($row = mysql_fetch_assoc($result))
{

echo "<li><a href='?id=".$row['id_cat']."'>".$row['name']."</a><br/>\n";

if($id == $row['id_cat'])
echo pod_cat($id);

}

echo "</ul>\n";

Спустя 20 минут, 57 секунд (24.11.2009 - 11:31) Семён написал(а):
Ребят вы (Varyag666, Кулиев) извращенцы...

Спустя 35 минут, 15 секунд (24.11.2009 - 12:07) glock18 написал(а):
Kuliev
я разницы вообще не увидел smile.gif

Спустя 9 минут, 9 секунд (24.11.2009 - 12:16) Семён написал(а):
Цитата (glock18 @ 24.11.2009 - 13:07)
Kuliev
я разницы вообще не увидел smile.gif

У него есть разница, он сделал тоже самое, но добавил SQL в функцию. laugh.gif

Спустя 21 минута, 46 секунд (24.11.2009 - 12:38) Kuliev написал(а):
Семён
glock18

Вы меня не правильно поняли, я хотел показать парню как можно упростить его код, тем более что СЕМЕН уже дал подсказку как можно это сделать за один запрос, до моего поста!

Поэтому пускай подумает как ему вывести и отформатировать данные из полученного запроса.

Цитата


SELECT *
FROM kategory
LEFT JOIN podkategory
ON kategory.id_kategory=podkategory.id_kategory


Спустя 2 часа, 1 минута, 33 секунды (24.11.2009 - 14:39) Varyag666 написал(а):
проблема не запросе, а в правильном выводе информации

Не могу сделать так, чтобы получалось следующее:
КАТЕГОРИЯ 1
ПОДКАТЕГОРИЯ 1.1
ПОДКАТЕГОРИЯ 1.2
ПОДКАТЕГОРИЯ 1.3
ПОДКАТЕГОРИЯ 1.4

КАТЕГОРИЯ 2
ПОДКАТЕГОРИЯ 2.1
ПОДКАТЕГОРИЯ 2.2
ПОДКАТЕГОРИЯ 2.3
ПОДКАТЕГОРИЯ 2.4

Kuliev,в твоем коде я мало что понял... Я незнаю как вывести из одной таблицы в нужном порядке. Куда копать?

Спустя 3 часа, 55 минут, 54 секунды (24.11.2009 - 18:35) Argnist написал(а):
Семен все сказал) тебе выдаст массив где элементы будут номер категории, номер подкатегории и т.д.) преобразуй их как хочешь и будет тебе счастье

Спустя 10 часов, 57 минут, 31 секунда (25.11.2009 - 05:33) Varyag666 написал(а):
Цитата ("Argnist")
Семен все сказал) тебе выдаст массив где элементы будут номер категории, номер подкатегории и т.д.) преобразуй их как хочешь и будет тебе счастье


Одним не могу сделать как надо, двумя получилось:

$sql="SELECT name FROM kategory ORDER BY positions ASC";//таже история что и в первый раз, выберем категории
$bufer=mysql_query($sql);
$i=1; //теперь выберем все, как Вы написали
$sql="SELECT * FROM kategory LEFT JOIN podkategory ON kategory.id_kategory=podkategory.id_kategory
ORDER BY positions ASC"
;
$result=mysql_query($sql); //теперь я все это вывожу, первый цикл выводит категории
while ($mass2=mysql_fetch_assoc($bufer)){
echo "$mass2[name]<ul>";//категория
if($i==0){
echo "<li>$mass[name_kat]</li>";//это элемент выпадает когда выполняется break
$i++;
}
while($mass=mysql_fetch_assoc($result)){//второй подкатегории
if($mass2[name]<>$mass[name]){
echo "</ul>";
$i--; //возвращаемся чтобы вывести категорию
break;
}
echo "<li>$mass[name_kat]</li>";
}
}


Ну уже не 10 обращений а всего лишь 2, помоему неплохо? rolleyes.gif
Twin,Argnist,Kuliev,Семён,Glock18 Благодарю за помощь!

Спустя 13 минут, 51 секунда (25.11.2009 - 05:46) Varyag666 написал(а):
Может вместо второго лучше такой запрос, он быстрее??

SELECT kategory.name,podkategory.name_kat FROM kategory,podkategory WHERE kategory.id_kategory=podkategory.id_kategory
ORDER BY positions ASC


Вместо
SELECT * FROM kategory LEFT JOIN podkategory ON kategory.id_kategory=podkategory.id_kategoryORDER BY positions ASC


Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.