X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Создание универсального запроса
yuriy_hb
yuriy_hb
Topic Starter сообщение 24.6.2011, 18:44; Ответить: yuriy_hb
Сообщение #1


Привет, всем. Кто подскажет, как можно создать запрос к БД в котором за один мах можно подсчитать количество записей и вывод результата. К примеру, есть у меня запрос (довольно обширный):

SELECT
oderAuto.request as request,
oderAuto.type as typeauto,
oderAuto.groupZapch as groupzapch,
oderAuto.data as data,
oderAuto.timenow as timenow,
markaauto.marka as marka,
modelauto.model as model,
groupzap.group as gr,
region.city as city,
supportState.status as status,
supportState.answer as answer,
supportState.bookMark as bookMark
FROM oderAuto
INNER JOIN markaauto ON oderAuto.marka = markaauto.id_Marka
INNER JOIN modelauto ON oderAuto.model = modelauto.id_Model
INNER JOIN groupzap ON oderAuto.groupZapch = groupzap.idGroup
INNER JOIN region ON oderAuto.region = region.id_REG
LEFT JOIN supportState ON supportState.request = oderAuto.request AND supportState.email = 'mih_76@mail.ru'
WHERE
oderAuto.timenow >= 9592000;

он делает выбору из таблиц и возвращет результат. по времи выполнения он занимает около 1,7с. (многовато).
Можно ли в этом запросе одновременно подсчитать кол-во строк (типа count(*), чтобы не создавать новый запрос к БД, так как время потраченое на запросы существенно замедляет работу???
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 24.6.2011, 19:34; Ответить: alexdrob
Сообщение #2


Ну так раз вы возвращаете результат весь то и считайте уже на пхп
mysql_num_rows
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yuriy_hb
yuriy_hb
Topic Starter сообщение 24.6.2011, 20:12; Ответить: yuriy_hb
Сообщение #3


делов в том что результат запроса у меня используют две функции:

вот запрос $dos = "SELECT oderAuto.request as request, oderAuto.type as typeauto, ..."
а вот как я использую его:
$jh = mysql_query($dos);
$kolichestvo = mysql_num_rows($jh);

затем:
$result = mysql_query($dos);
while ($row = mysql_fetch_assoc($result))
...
тоисть к сформированому запросу подключаются две функции.
нужно как-то за один раз использовать без лишних запросов к БД???
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 24.6.2011, 20:19; Ответить: alexdrob
Сообщение #4


оО, а с чего вы взяли что mysql_num_rows выполняет запрос к бд?
вы же её уже результат отдаёте. я сомневаюсь что она выполняет запрос повторно, иначе она бесполезная.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yuriy_hb
yuriy_hb
Topic Starter сообщение 24.6.2011, 20:23; Ответить: yuriy_hb
Сообщение #5


вот это один запрос:
$jh = mysql_query($dos);
$kolichestvo = mysql_num_rows($jh);

а вот это второй запрос:
$result = mysql_query($dos);
while ($row = mysql_fetch_assoc($result))
...

получается у нас 2 запроса. А нужен один, так как запросы тяжеловатые...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 24.6.2011, 20:27; Ответить: alexdrob
Сообщение #6


то есть один и тот же запрос?, для чего? если результат первого запроса вы получили а второй запрос тот же самый. удалите второй и всё :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yuriy_hb
yuriy_hb
Topic Starter сообщение 24.6.2011, 20:33; Ответить: yuriy_hb
Сообщение #7


да, один и тото же запрос используется в разных целях.
Первый раз имеем кол-во строк согласно критерию выборки ($jh = mysql_query($dos); $kolichestvo = mysql_num_rows($jh);
а во второй раз выводим результат на лицо с помощью цыкла
$result = mysql_query($dos); while ($row = mysql_fetch_assoc($result))...

Дело в том что, вот этот запрос: $dos = "SELECT oderAuto.request as request, oderAuto.type as typeauto, ..." в дальнейшем дополняется еще параметрами (как ORDER BY, LIMIT...) в зависимости от настроек в БД.
Вот к примеру:
if(isset($_REQUEST['sortRequest'])) {
$dos = $dos . " ORDER BY request ASC "; }
и после прохождения всех этих процедур только затем прводится запрос к БД и затем выводим его в цыкле...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yuriy_hb
yuriy_hb
Topic Starter сообщение 24.6.2011, 20:45; Ответить: yuriy_hb
Сообщение #8


А подскажите, нельзя как-то в одном запросе извлечь и кол-во строк табл. и результат выборки?

Типа SELECT tab1.NAME, (SELECT COUNT(*) FROM....
Правда ужасный запрос получиться, но другого путя я не вижу, к сожалению...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 24.6.2011, 20:55; Ответить: alexdrob
Сообщение #9


(yuriy1976 @ 24.6.2011, 23:45) *
А подскажите, нельзя как-то в одном запросе извлечь и кол-во строк табл. и результат выборки?

И что вам это даст?
Ну извлечёте вы и количество строк и все строки, вопрос, раз вы извлеки все строки зачем вам уже знать их количество?
Тем более если вы все строки выбрали в вашем варианте, а потом зачем делать ещё один запрос с лимитом, если у вас уже есть эти строки и даже больше.

Количество узнают что бы потом ограничить выборку из базы с помощью limit.
Обычно делают так, вначале возвращают количество строк, а потом вторым запросом только несколько строк с помощью limit.

первый запрос должен быть как минимум вот таким
SELECT
count(oderAuto.id)
FROM oderAuto INNER JOIN markaauto ON oderAuto.marka = markaauto.id_Marka
INNER JOIN modelauto ON oderAuto.model = modelauto.id_Model
INNER JOIN groupzap ON oderAuto.groupZapch = groupzap.idGroup
INNER JOIN region ON oderAuto.region = region.id_REG
LEFT JOIN supportState ON supportState.request = oderAuto.request AND supportState.email = 'mih_76@mail.ru'
WHERE oderAuto.timenow >= 9592000;

но джоины можно отбросить если в условиях отбора они не участвуют.
что то типа
[PHP]
$sql = "SELECT count(oderAuto.id) FROM oderAuto WHERE oderAuto.timenow >= 9592000";
$count = mysql_result(mysql_query($sql),0);
// в переменной $count у вас количество строк, а дальше
$sql = "SELECT
oderAuto.request as request,
oderAuto.type as typeauto,
oderAuto.groupZapch as groupzapch,
oderAuto.data as data,
oderAuto.timenow as timenow,
markaauto.marka as marka,
modelauto.model as model,
groupzap.group as gr,
region.city as city,
supportState.status as status,
supportState.answer as answer,
supportState.bookMark as bookMark
FROM oderAuto
INNER JOIN markaauto ON oderAuto.marka = markaauto.id_Marka
INNER JOIN modelauto ON oderAuto.model = modelauto.id_Model
INNER JOIN groupzap ON oderAuto.groupZapch = groupzap.idGroup
INNER JOIN region ON oderAuto.region = region.id_REG
LEFT JOIN supportState ON supportState.request = oderAuto.request AND supportState.email = 'mih_76@mail.ru'
WHERE
oderAuto.timenow >= 9592000
LIMIT {$start}, {$items_to_page}";
$res = mysql_query($sql);
while($row = mysql_fetch_array($res))
{
// вывод
}[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yuriy_hb
yuriy_hb
Topic Starter сообщение 24.6.2011, 21:07; Ответить: yuriy_hb
Сообщение #10


но в любом случае у нас получается два запроса:
первый: $sql = "SELECT count(oderAuto.id) FROM oderAuto WHERE oderAuto.timenow >= 9592000";
второй: $sql = "SELECT oderAuto.request as request, oderAuto.type as typeauto, ..
Верно?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) как заслужить право на создание новой темы?
7 writer80 2208 12.3.2024, 22:54
автор: Lumex
Открытая тема (нет новых ответов) <Braga/> Создание Telegram-ботов, web-приложений, крипто-бирж, сайтов.
2 newbraga 1775 10.3.2024, 22:04
автор: newbraga
Открытая тема (нет новых ответов) СОЗДАНИЕ : / САЙтЫ / ЛЕНДЫ / БОТЫ ТГ / ВАЙТЫ / КРЕО / СОФТЫ / ДИЗАЙН [PHP, JS, HTML/CSS] и другое
5 CULA 3399 19.12.2023, 18:55
автор: CULA
Открытая тема (нет новых ответов) Создание и ведение аккаунтов в соцсетях ("В контакте"/Telegram)
Услуги от профессионального журналиста и SMM-менеджера
2 AvtorXXX 1707 13.11.2023, 23:47
автор: AvtorXXX
Открытая тема (нет новых ответов) Создание информационной площадки с доской объявлений
1 xweb 2061 16.1.2023, 16:25
автор: xweb


 



RSS Текстовая версия Сейчас: 19.4.2024, 18:50
Дизайн