Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > MySQL: не работает запрос с FOUND_ROWS()


Автор: Perl_sapiens 7.4.2008, 15:24
Привет. Вот код пхп:
Код
$sql = "SELECT spr_organizaciy.Nazvanie, Dokumenti.Data_vipiski_scheta, spr_tovarov.Tovar, Rashod.Tiraj, Rashod.Obreznoy_format, spr_vidov_tehkart.nazvanie
FROM spr_organizaciy
INNER JOIN (
spr_tovarov
INNER JOIN (
(
Dokumenti
INNER JOIN Rashod ON Dokumenti.Id = Rashod.RDokument
)
INNER JOIN spr_vidov_tehkart ON Rashod.sostoyanie_tehkarti = spr_vidov_tehkart.id
) ON spr_tovarov.Id = Rashod.Tovar
) ON spr_organizaciy.Id = Dokumenti.Organizaciya;";


$res2 = mysql_query($sql."\nSELECT FOUND_ROWS();",$res) or die("Error#3: ".mysql_error());
$numrow = mysql_fetch_array($res2);
$res2 = mysql_query(($sql."\nLIMIT ".$limit." , 30"),$res) or die("Error#4: ".mysql_error());


А вот результат:
Код
Error#3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
SELECT FOUND_ROWS()' at line 12


Что не так, кто знает?
В phpMyAdmin все прекрасно выполняется

Автор: skyboy 7.4.2008, 15:58
кто тебе сказал, что mysql_query поддерживает multistatesment-запросы? тебя обманули. чтоб выполнять несколько запросов в одном вызове функции, используй mysqli.
в то же время, ничего не мешает использовать для mysql_query: для выборки и для вызoва found_rows()

Автор: Perl_sapiens 7.4.2008, 16:08
Э... неочень понял последнюю твою фразу...
И по поводу mysqli -  smile 

Автор: Feldmarschall 7.4.2008, 16:20
Perl_sapiens, не надо пихать два запроса в один вызов mysql_query
надо сделать два вызова. 

Автор: Perl_sapiens 7.4.2008, 16:30
Сделал:
Код
$sql = 'SELECT spr_organizaciy.Nazvanie, Dokumenti.Data_vipiski_scheta, spr_tovarov.Tovar, Rashod.Tiraj, Rashod.Obreznoy_format, spr_vidov_tehkart.nazvanie
FROM spr_organizaciy
INNER JOIN (
spr_tovarov
INNER JOIN (
(
Dokumenti
INNER JOIN Rashod ON Dokumenti.Id = Rashod.RDokument
)
INNER JOIN spr_vidov_tehkart ON Rashod.sostoyanie_tehkarti = spr_vidov_tehkart.id
) ON spr_tovarov.Id = Rashod.Tovar
) ON spr_organizaciy.Id = Dokumenti.Organizaciya
LIMIT '.$limit.' , 30';

$res2 = mysql_query($sql,$res) or die("Error#3: ".mysql_error());

$sql2 = 'SELECT FOUND_ROWS();';
$res3 = mysql_query($sql2,$res) or die("Error#4: ".mysql_error());
$numrow = mysql_fetch_array($res3);


В $numrow[0] содержится 30, а я ожидаю число 81.

-----

Вот когда в phpMyAdmin выполняешь вышеуказанный запрос, то он еще умудряется попутно узнать Сколько_Всего_Записей_получилось_в_этом_запросе: Показывает записи 0 - 29 (81 всего, Запрос занял 0.0121 сек).

Вот как мне это сделать самому? На др. форуме сказали это юзать: SELECT FOUND_ROWS();, но как видите, выдает че-то не то...

Автор: mishaSL 7.4.2008, 16:35
По поводу:
Цитата(skyboy @  7.4.2008,  15:58 Найти цитируемый пост)
ничего не мешает использовать для mysql_query: для выборки и для вызoва found_rows() 


skyboy, имел ввиду наверное это http://ru2.php.net/manual/ru/function.mysql-num-rows.php

Цитата(Perl_sapiens @  7.4.2008,  16:08 Найти цитируемый пост)
И по поводу mysqli

Если сильно хочется делать несколько запросов за раз, то:
http://ru2.php.net/mysqli_multi_query

Автор: Perl_sapiens 7.4.2008, 16:54
Цитата(mishaSL @  7.4.2008,  16:35 Найти цитируемый пост)
skyboy, имел ввиду наверное это mysql_num_rows

НЕ, тогда эт точно не подойдет, т.к. покажет только число отображенных записей, а не сколько их действительно найдено

Автор: skyboy 7.4.2008, 16:55
mishaSL, нет, я имел в виду SQL-функцию http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows, которая, в отличие от php'шной mysql_num_rows() возвращает количество строк, которое было бы выбрано, если бы не ограничение по limit.
Perl_sapiens, в select должна быть директива http://dev.mysql.com/doc/refman/4.1/en/select.html. у тебя она где?

Автор: Feldmarschall 7.4.2008, 16:55
Perl_sapiens, а на др. форуме не сказали, что в основном запросе надо писать SQL_CALC_FOUND_ROWS?

по поводу же пхпмайадмина, если так уж хочется делать, как он, то это не запрещено: руками отрезать от запроса LIMIT и смотреть, сколько строк вернет всего

mishaSL, я не думаю, что он имел в виду mysql_num_rows =)

Автор: Perl_sapiens 7.4.2008, 17:09
Цитата(Feldmarschall @  7.4.2008,  16:55 Найти цитируемый пост)
по поводу же пхпмайадмина, если так уж хочется делать, как он, то это не запрещено: руками отрезать от запроса LIMIT и смотреть, сколько строк вернет всего

Хорошо. А теперь представь, что строк не 81, а 4млн. Эт долго будет и тупо.


Цитата(Feldmarschall @  7.4.2008,  16:55 Найти цитируемый пост)
а на др. форуме не сказали, что в основном запросе надо писать SQL_CALC_FOUND_ROWS?

Нет))) Тупо сказали и всё, замолчали. Только на Винграде я получаю быстро ответы(эт честно, без "лизаний")

skyboy, спс за разъяснение. Всё заработало как надо.  smile 

Автор: Feldmarschall 7.4.2008, 17:13
тем не менее, если текст между select и from заменить на count(*), а именно так, насколько мне известно, поступает пхпмайадмин, получится умно и быстро.

Автор: mishaSL 7.4.2008, 17:17
Цитата(skyboy @  7.4.2008,  16:55 Найти цитируемый пост)
mishaSL, нет, я имел в виду SQL-функцию found_rows, которая, в отличие от php'шной mysql_num_rows() возвращает количество строк, которое было бы выбрано, если бы не ограничение по limit.

Цитата(Feldmarschall @  7.4.2008,  16:55 Найти цитируемый пост)
mishaSL, я не думаю, что он имел в виду mysql_num_rows =) 

Сори, не вник до конца в тему smile 


Perl_sapiens, как вариант и без особых проблем, делаешь 2 запроса:
1. COUNT(*) - считаешь сколько там строк
2. выбираешь поля которые тебе надо с LIMIT

Добавлено через 4 минуты
Perl_sapiens, если еще представите структуру таблиц и описание что вы хотите получить, то можно еще и запрос попробовать оптимизировать smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)