[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Уменьшить количество запросов к базе MySql...
linf
Нужно около ссылок написать, сколько подобных записей в таблице.

Я делаю это так:

$type_result = mysql_query("SELECT COUNT(id) AS id FROM all WHERE  type='Модель 16'", $db);
$count = mysql_fetch_assoc($type_result);
echo "<A href=".ABSOLUTE_WAY."/type/16>Модель 16</A> <I>[".$count[id]."]</I><BR>";

$type_result = mysql_query("SELECT COUNT(id) AS id FROM all WHERE type='Модель 18'", $db);
$count = mysql_fetch_assoc($type_result);
echo "<A href=".ABSOLUTE_WAY."/type/18>Модель 18</A> <I>[".$count[id]."]</I><BR>";

$type_result = mysql_query("SELECT COUNT(id) AS id FROM all WHERE type='Модель 22'", $db);
$count = mysql_fetch_assoc($type_result);
echo "<A href=".ABSOLUTE_WAY."/type/22>Модель 22</A> <I>[".$count[id]."]</I><BR>";

// ... итд 50 ссылок и соответсвенно 50 запросов


Что то мне подскаывает, что дедлать 50 запросов ради вывода колонки ссылок, неправильно.
Есть ли способ проще?



Спустя 14 минут, 23 секунды (31.01.2010 - 16:32) Ice написал(а):
"SELECT COUNT(id) AS id FROM all WHERE  type IN(".implode(',', $model_array).")" 

Спустя 1 минута, 57 секунд (31.01.2010 - 16:34) sergeiss написал(а):
Вот на 100% рабочий запрос из Постгре, на который, при необходимости, можно наложить и какие-то ограничения через WHERE

select userid, count(userid) from statistics
group by userid


Ice - а ты уверен, что твой запрос даст то, что нужно? smile.gif

Спустя 3 минуты, 22 секунды (31.01.2010 - 16:38) Ice написал(а):
Я его не тестировал smile.gif

Спустя 4 минуты, 16 секунд (31.01.2010 - 16:42) sergeiss написал(а):
Цитата (Ice @ 31.01.2010 - 17:38)
Я его не тестировал

Так ты сначала протестируй, а потом советуй! По твоему запросу будут выбраны все строки, удовлетворяющие условию, и будет подсчитано их общее количество.

Спустя 3 часа, 25 минут, 53 секунды (31.01.2010 - 20:08) Nikitian написал(а):

SELECT COUNT(*) AS id,`type` FROM all WHERE `type` in ('Модель 16','Модель 17','Модель 18') group by `type`

Спустя 6 часов, 28 минут, 59 секунд (1.02.2010 - 02:37) FatCat написал(а):
Цитата (linf @ 31.01.2010 - 17:18)
Есть ли способ проще?

Неверно спроектирована база, оттого и запросы нерациональные.
Похожая задача: в списке тем форума к кажой теме вывести число сообщений в теме.
Нерационально каждый раз запрашивать таблицу сообщений и считать количество сообщений в теме; рационально в таблице тем добавить поле числа сообщений и пересчитывать его при отправке сообщения в форум.


Nikitian
Боюсь что выигрыша в нагрузке не будет.
Попробовал на форумной базе. Запрос подсчета для 30 топиков занял 0.0019 сек. Для одного - менее 0.0001

Спустя 25 минут, 28 секунд (1.02.2010 - 03:02) Nikitian написал(а):
Не знаю в чём не будет выигрыша. Вопросы был как уменьшить количество запросов, чтобы получить результат. Я показал как свести всё в один запрос, вместо того, чтобы делать 50 раз "select count()"

Спустя 1 день, 17 часов, 40 минут, 29 секунд (2.02.2010 - 20:43) linf написал(а):
В конечном итоге не без помощи экспертов, пришел к такому решению:

$type_result = mysql_query("SELECT COUNT(*) as `count`, `type` FROM `all` GROUP BY `type`", $db);

while ($link = mysql_fetch_assoc($type_result)) {
echo "<A href=".ABSOLUTE_WAY."/type/".$link['type'].">".str_replace("_", " ", $link['type'])."</A> <I>[".$link['count']."]</I><BR class=br1>";
}


теперь нужно как то добавить условие:

WHERE out=`$out`AND in=`$in`


но чето куда не вставлю, нарушается работа выводится хрень...


Если вставляю так:

mysql_query("SELECT COUNT(*) as `count`, `type` FROM `all_magazin` WHERE out=`$out`AND in=`$in` GROUP BY `type`", $db);


пишет:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in...

Спустя 28 минут, 34 секунды (2.02.2010 - 21:11) Ice написал(а):
ваа я уже запустался сорри, сорри)

Спустя 12 минут, 19 секунд (2.02.2010 - 21:24) linf написал(а):
Цитата (Ice @ 2.02.2010 - 22:11)
ваа я уже запустался сорри, сорри)

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

но без WHERE она ищет по всей таблице, а мне нужно что бы толкьо там, где:
out=`$out`AND in=`$in`

Спустя 2 часа, 24 минуты, 30 секунд (2.02.2010 - 23:48) Nikitian написал(а):
Если in - это имя поля, то надо его апострофами обособить, т.к. это зарезервированное слово. Если же это оператор IN, то используете вы его абсолютно бездумно и потому неправильно.


_____________
Live in new format =)
Быстрый ответ:

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