Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   mysql_result из запроса = странно (http://forum.oszone.net/showthread.php?t=176606)

Djedai 26-05-2010 07:37 1421285

mysql_result из запроса = странно
 
берем простой запрос
PHP код:

$q="SELECT COUNT(*) FROM owa_document ";
$h mysql_query($q) or print mysql_error($h);
$result mysql_result($h); 

работает отлично,
берем запрос:
PHP код:

$q "SELECT COUNT(*) FROM owa_document LEFT JOIN owa_request ON owa_request.document_id = owa_document.id WHERE owa_document.url =  'http://prozaru.com/2010/04/krasnyiy-mesyats-glava3/' GROUP BY owa_request.document_id, owa_request.document_id";
$h mysql_query($q) or print mysql_error($h);
$result mysql_result($h); 

выдает ошибку supplied argument is not a valid MySQL result resource

причем в phpmyadmin - он корректно возвращает кол-во записей:
Код:

SET SQL_BIG_SELECTS =1;# MySQL вернула пустой результат (т.е. ноль строк).
# MySQL вернула пустой результат (т.е. ноль строк).
# MySQL вернула пустой результат (т.е. ноль строк).
SELECT COUNT( * )
FROM owa_document
LEFT JOIN owa_request ON owa_request.document_id = owa_document.id
WHERE owa_document.url =  'http://prozaru.com/2010/04/krasnyiy-mesyats-glava3/'
GROUP BY owa_request.document_id, owa_request.document_id


Sham 26-05-2010 19:32 1421751

Цитата:

Цитата Djedai
mysql_result($h); »

имхо в первом случае строка одна, и второй аргумент не требуется (хотя обязателен), а во втором - результат многострочный и требуется второй параметр - номер строки.
Цитата:

Цитата Djedai
mysql_error($h) »

параметр дб линк на соединение, или без него (берется последнее активное), а у вас ресурс, что неправильно.

Djedai 26-05-2010 21:39 1421832

за подключения отвечает cms.
вообщем когда вместо LEFT JOIN поставил RIGHT JOIN (и даже INNER JOIN) заработало все. Видимо где-то косяк с LEFT JOIN и связке ON (хотя phpmyadmin понимал, но писал что полученны пустые строки вначале)

вот рабочий результат, переделал JOIN


PHP код:

$where1=get_permalink();
$q="SELECT COUNT(owa_document.id) FROM owa_document RIGHT JOIN owa_request ON owa_document.id = owa_request.document_id WHERE owa_document.url='".$where1."'";
#echo $q;
$h mysql_query($q) or print mysql_error($h);
$result mysql_result($h,0); 


Sham 26-05-2010 22:37 1421859

Цитата:

Цитата Djedai
mysql_error($h) »

см. допустимый параметр к mysql_error. $h - это неправильный параметр (ресурс результата запроса), должен быть ресурс на соединение с MySQL, или пусто.
Цитата:

Цитата Djedai
Видимо где-то косяк с LEFT JOIN и связке ON »

нет никакого косяка, RIGHT JOIN работает аналогично LEFT JOIN.
Цитата:

The implementation of RIGHT JOIN is analogous to that of LEFT JOIN with the roles of the tables reversed.

Djedai 26-05-2010 22:54 1421869

как можно ускорить запрос?
поля индексные, char

Sham 26-05-2010 23:07 1421877

EXPLAIN SELECT
http://dev.mysql.com/doc/refman/5.5/...g-explain.html
http://www.mysql.ru/docs/man/EXPLAIN.html
Цитата:

Цитата Djedai
SELECT COUNT(owa_document.id) FROM owa_document RIGHT JOIN owa_request ON owa_document.id = owa_request.document_id WHERE owa_document.url='".$where1."' »

тут не нужен join, ибо не вижу полей со второй таблицы...

Djedai 27-05-2010 00:01 1421902

а без join по where раз в 10 медленнее пашет, и часто уходило в даун таймаута

вот две таблицы и поля
owa_document.id = owa_request.document_id

Sham 27-05-2010 00:28 1421910

Если со второй таблицы поля не нужны, то и связка не нужна. join служит только для связки, а никак не для оптимизации запроса.

Djedai 19-06-2010 14:07 1437412

Оптимизировал запрос (еле как)
Код:

$q="SELECT owa_request.visitor_id FROM owa_document, owa_request WHERE
owa_request.document_id=owa_document.id AND owa_document.url='".get_permalink()."'

в

Код:

$q= "SELECT DISTINCT owa_request.visitor_id
FROM owa_document INNER JOIN owa_request ON owa_document.id = owa_request.document_id
WHERE (((owa_document.url)='".get_permalink()."'));";

1. стал исполняться не 60секунд, а примерно 40секунд, можно ли его еще ускорить?

2. как сделать чтобы в итоге с этого запроса получать COUNT (записей) ?

Sham 21-06-2010 16:17 1438724

проверьте индексы на owa_document.id owa_request.document_id и
owa_document.url

Цитата:

Цитата Djedai
2. как сделать чтобы в итоге с этого запроса получать COUNT (записей) ? »

если возвращаются строки, то mysql_num_rows (PHP), иначе SELECT SQL_CALC_FOUND_ROWS ... с последующим SELECT FOUND_ROWS()


Время: 08:17.

Время: 08:17.
© OSzone.net 2001-