[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подскажыте решение
Pinoplast
Есть скрипт вывода категорий из базы
PHP
<?




        
            




            include (
'cgi-bin/php/bd.php');

            
$rezult1=mysql_query ("SELECT * FROM   kategorii",$db);
                
                    
                
                    if (!
$rezult1)
                    {
                    echo 
"ЗАПРОС К БАЗЕ НЕ РАБОТАЕТ, СООБЩИТЕ АДМИНИСТРАТОРУ";
                    exit(
mysql_error());
                    }
                    
                                if (
mysql_num_rows($rezult1) > 0)
                                {
                                




                                
$myrow1=mysql_fetch_array($rezult1);
                                    
                                



                                do     
                                    
                                {

                                
printf ("<p id='left_p4'><a href='view_cat.php?cat=%s'>%s</a></p>",$myrow1["id"],$myrow1["kat"]);

                                }
                                while (
$myrow1=mysql_fetch_array($rezult1));    
                                    
                                    
                            
                                    
                                }
                                else
                                {
                                echo 
"ЗА ЗАПРОСОМ НИЧЕГО НЕ НАЙДЕНО";
                                exit();
                                }
            
            














?&g



как мне к категориям добавить еще один скрипт по подсчету количества заметок по категориям? К примеру в фальле podschet.php имеет скрипт подсчета, куда мне его вписать и как? (другими словами связать два скрипта чтоб выводились категории и сзади количество статей по категориям, в виде числа)



Пример вида вывода:


Авто (2)

Медецына (3)





Спустя 5 минут, 27 секунд (15.09.2009 - 18:58) DeeKeiD написал(а):
PHP
# Запрос на получения id из базы где поле cat = cars
$car_res = mysql_query("SELECT `id` FROM `kategorii` WHERE `cat` = 'cars'");
# Подсчет найденых id
$car_total = mysql_num_rows($car_res);
# Запрос на получения id из базы где поле cat = medicine
$med_res = mysql_query("SELECT `id` FROM `kategorii` WHERE `cat` = 'medicine'");
# Подсчет найденых id
$med_total = mysql_num_rows($med_res);

В нужное место добавь
PHP
echo $car_total;

или
PHP
echo $med_total;

Спустя 2 минуты, 9 секунд (15.09.2009 - 19:01) Michael написал(а):
Надо запрос написать чтоб в нем все и выбиралось.
Если две таблицы то соединяй их и выводи.

P.S. Тут про стиль оформления кода много сегодня писали, узнаю.
Но мне кажется с пробелами в левом поле ты переборщил.

Спустя 7 минут, 37 секунд (15.09.2009 - 19:08) Pinoplast написал(а):
Цитата (Michael @ 15.09.2009 - 16:01)
Надо запрос написать чтоб в нем все и выбиралось.
Если две таблицы то соединяй их и выводи.

P.S. Тут про стиль оформления кода много сегодня писали, узнаю.
Но мне кажется с пробелами в левом поле ты переборщил.

Так дело в том и состоит что категории в цыкле выводяться из базы в одном запросе по одной таблице, а подсчет в цыкле по совершено другой таблице а как их связать мозги лопают)))

Спустя 3 минуты, 2 секунды (15.09.2009 - 19:11) Pinoplast написал(а):
Цитата (DeeKeiD @ 15.09.2009 - 15:58)
PHP
# Запрос на получения id из базы где поле cat = cars
$car_res = mysql_query("SELECT `id` FROM `kategorii` WHERE `cat` = 'cars'");
# Подсчет найденых id
$car_total = mysql_num_rows($car_res);
# Запрос на получения id из базы где поле cat = medicine
$med_res = mysql_query("SELECT `id` FROM `kategorii` WHERE `cat` = 'medicine'");
# Подсчет найденых id
$med_total = mysql_num_rows($med_res);

В нужное место добавь
PHP
echo $car_total;

или
PHP
echo $med_total;

а как ето echo привязать к цыклу вывода?

Спустя 6 минут, 28 секунд (15.09.2009 - 19:18) DeeKeiD написал(а):
Ну наверное запихнуть запрос в цыкл?

Спустя 14 минут, 14 секунд (15.09.2009 - 19:32) twin написал(а):
Лучшим вариантом тут было бы создать еще одно поле в таблицу с категориями, где и вести подсчет. Запрос в цикл - моветон и ужос.
И убери do... while, совсем он тут не к месту.

Спустя 10 минут, 45 секунд (15.09.2009 - 19:43) Pinoplast написал(а):
Цитата (twin @ 15.09.2009 - 16:32)
Лучшим вариантом тут было бы создать еще одно поле в таблицу с категориями, где и вести подсчет. Запрос в цикл - моветон и ужос.
И убери do... while, совсем он тут не к месту.

да я понял но позно!!! теперь надо все переписавть(((

Спустя 1 минута, 49 секунд (15.09.2009 - 19:44) twin написал(а):
О Боже!!! Катастрофа и апокалипсис!!!! Все 15 строк переписывать придется!!!! biggrin.gif biggrin.gif biggrin.gif

Спустя 8 минут, 42 секунды (15.09.2009 - 19:53) Pinoplast написал(а):
кароче вырулил по варианту DeeKeiD

однако его варинт дает во всех случаях 0 а не подсчет не врубаю почему???

Спустя 2 минуты, 31 секунда (15.09.2009 - 19:56) Pinoplast написал(а):
Написал так

скрипт вставки

PHP
это файл podschet_stateu_kategorii.php
<?

$car_res = mysql_query("SELECT * FROM text WHERE id = '$podschet;'",$db);
$car_total = mysql_num_rows($car_res);
echo "....".$car_total."</p>";


скрипт вывода
PHP
<?

            include ('cgi-bin/php/bd.php');

            $rezult1=mysql_query ("SELECT * FROM   kategorii",$db);
                
                    if 
(!$rezult1)
                    {
                    echo "ЗАПРОС К БАЗЕ НЕ РАБОТАЕТ, СООБЩИТЕ АДМИНИСТРАТОРУ";
                    exit(mysql_error());
                    }
                    
                                if 
(mysql_num_rows($rezult1) > 0)
                                {
                               
                                $myrow1
=mysql_fetch_array($rezult1);
                                    
                                $myrow1
["id"]=$podschet;
                                do     
                                    
                                
{
                                printf ("<p id='left_p4'><a href='view_cat.php?cat=%s'>%s</a>",$myrow1["id"],$myrow1["kat"]);
                                include("podschet_stateu_kategorii.php");
                                }
                                while ($myrow1=mysql_fetch_array($rezult1));    
                                 
                                
}
                                else
                                
{
                                echo "ЗА ЗАПРОСОМ НИЧЕГО НЕ НАЙДЕНО";
                                exit();
                                }

почему ноль не врубаю

вариант вывода

авто 0

медецына 0

Спустя 3 минуты, 54 секунды (15.09.2009 - 20:00) Pinoplast написал(а):
может это оформить все через count() ?

Спустя 1 минута, 22 секунды (15.09.2009 - 20:01) twin написал(а):
Ужос.... Ты это в цикл?
PHP
$car_res mysql_query("SELECT * FROM text WHERE id = '$podschet;'",$db);

Самоубийца.

Спустя 1 минута, 5 секунд (15.09.2009 - 20:02) Pinoplast написал(а):
почем?

Спустя 4 минуты, 17 секунд (15.09.2009 - 20:06) twin написал(а):
Потом, что ты вытаскиваешь в php всю таблицу, целиком. В цикле. Склероз начнется у сервера с таким подходом скоро. Делай по уму тебе говорят, пока не поздно. mad.gif biggrin.gif

Спустя 1 минута, 57 секунд (15.09.2009 - 20:08) Pinoplast написал(а):
Имееш виду что при увеличении базы, цыкл начнет долго исполняться???

Спустя 57 минут, 35 секунд (15.09.2009 - 21:06) twin написал(а):
Памяти много потребует. Ресурс будет жрать и время.

Спустя 17 часов, 42 минуты, 49 секунд (16.09.2009 - 14:49) Joker написал(а):
Ну если бы вид таблиц выложил бы лучше былоб но я примерно создал у себя

вот таблица категорий:

user posted image

вот таблица с заметками или текстами чем там нужно было вообщем не суть.

user posted image

А вот код

PHP
$res mysql_query ("SELECT `title`,(SELECT COUNT(*) FROM `texts` WHERE `id_cat`=t.`id`) as `count` FROM `kategorii` as t");

while (
$row=mysql_fetch_array($res))
{
    echo 
$row['title'] . ' (' $row['count'] . ')' "<br>";
}


вот что получиться при выводе

Код

q (1)
w (2)
e (3)
r (4)


q,w,e,r это название категорий чтоб не замарачиваться написал первые буквы на клаве. 1,2,3,4 соответсвенно сколько текстов в каждой категории.

Так неправильно считать чтоли? просто раз из экспертов некто не предложил такой вариант может так неправильно....

Спустя 17 минут, 2 секунды (16.09.2009 - 15:06) twin написал(а):
Вложенный запрос, это все равно запрос. И иногда даже бывает, что два запроса лучше, чем один сложный. А тут совсем неправильно. Гораздо экономичнее писать количество при модификации таблицы, чем дергать коунт при каждой генерации страницы.

Спустя 5 минут, 18 секунд (16.09.2009 - 15:11) Joker написал(а):
А почему неправильно? всмысле именно в этой ситауции или я чот в коде накасячил?

Спустя 6 минут, 22 секунды (16.09.2009 - 15:17) twin написал(а):
Зачем два запроса, когда спокойно можно обойтись одним? Категории меняются в базе на порядки реже, чем запрашиваются страницы.

Спустя 49 минут, 50 секунд (16.09.2009 - 16:07) glock18 написал(а):
а чем не устраивает связка COUNT + JOIN + GROUP BY pk ? в тему не вчитывался, а только посмотрел последние два поста. и каунт нигде хранить не надо, и запрос один будет.

Спустя 44 минуты, 5 секунд (16.09.2009 - 16:51) twin написал(а):
Ну тяжелый потому что запрос получится, зачем... GROUP BY довольно ресурсоемкая операция, плюс JOIN. Проще ведь отдельное поле и хранить в нем количество.
Ты не вник просто smile.gif

Спустя 1 час, 27 минут, 46 секунд (16.09.2009 - 18:19) Joker написал(а):
Нет я согласен что впроще поле создать но если допустим это уже не вариант например движок есть и чтоб поле создать придеться многое переписывать, то как вариант как облегчить запрос?

Спустя 4 минуты, 19 секунд (16.09.2009 - 18:23) twin написал(а):
Это не вариант. Это лень. За которую будет расчитываться хозяин сайта и пользователь. И вообще, разве на много труднее добавить поле в таблицу, чем сочинить сложный запрос?

Спустя 12 минут, 31 секунда (16.09.2009 - 18:36) glock18 написал(а):
Вообще много факторов есть.

Joker
Вложенный запрос точно не вариант.


twin, ты может и прав. Я действительно тут не особо читал. И group by не то чтобы какой-то тяжелый. в случае, когда в выборке из таблицы участвует индекс (ПК особенно) груп-бай + join будут выполняться весьма быстро.

Тут основной фактор - специфика информации. Если, скажем, счетчик - количество комментариев пользователя, рейтинг или еще чего, то вполне вероятно - доп. поле будет выгоднее. Если для какой-то очень динамичной информации, то счетчик проигрывает по-любому только на количестве обновлений.

Спустя 19 часов, 37 минут, 23 секунды (17.09.2009 - 14:13) Joker написал(а):
Цитата (glock18 @ 16.09.2009 - 21:36)
Joker
Вложенный запрос точно не вариант.


А можете обьяснить почему не вариант?

Спустя 1 час, 6 минут, 53 секунды (17.09.2009 - 15:20) glock18 написал(а):
Цитата
А можете обьяснить почему не вариант?


Могу. Дело в том, что запросы с подзапросами выполняются отнюдь не в том порядке, в котором это представляется на первый взгляд. Не так, как казалось бы логичным.

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

Вывод: неплохая производительность, несмотря на то что фактически выполняется два запроса. выполняются они сразу и без дополнительного обращения к серверу.

Как это делается на самом деле:
Сначала отрабатывает основной запрос. Для каждой строки его результата выполняется вложенный. И совершенно не зависит нужно это или нет. Зависимость количества вложенных запросов от количества записей в результате линейна.

Вывод: производительность куда хуже. Запросов вовсе даже не два получается, гораздо больше. Считай - 20 записей - 21 запрос. Это конечно, надо понимать, что обращение к базе всего одно, и при небольшой нагрузке запрос выполнится достаточно быстро.

А вообще, чтобы стало понятно, выполни два запроса на любой таблице с количеством записей хотя бы 10000:

SQL
select * from `table`;

SQL
select * from (select * from `table`) sel;


и сравни разницу в скорости.
А лучше используй explain - он наглядно покажет в чем разница между ними.
Быстрый ответ:

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