Войти

Показать полную графическую версию : mysql_result из запроса = странно


Djedai
26-05-2010, 07:37
берем простой запрос
$q="SELECT COUNT(*) FROM owa_document ";
$h = mysql_query($q) or print mysql_error($h);
$result = mysql_result($h);

работает отлично,
берем запрос:
$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
mysql_result($h); »
имхо в первом случае строка одна, и второй аргумент не требуется (хотя обязателен), а во втором - результат многострочный и требуется второй параметр - номер строки.
mysql_error($h) »
параметр дб линк на соединение, или без него (берется последнее активное), а у вас ресурс, что неправильно.

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

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



$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
mysql_error($h) »
см. допустимый параметр к mysql_error (http://docs.php.net/manual/en/function.mysql-error.php). $h - это неправильный параметр (ресурс результата запроса), должен быть ресурс на соединение с MySQL, или пусто.Видимо где-то косяк с 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
как можно ускорить запрос?
поля индексные, char

Sham
26-05-2010, 23:07
EXPLAIN SELECT
http://dev.mysql.com/doc/refman/5.5/en/using-explain.html
http://www.mysql.ru/docs/man/EXPLAIN.html
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
а без join по where раз в 10 медленнее пашет, и часто уходило в даун таймаута

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

Sham
27-05-2010, 00:28
Если со второй таблицы поля не нужны, то и связка не нужна. join служит только для связки, а никак не для оптимизации запроса.

Djedai
19-06-2010, 14:07
Оптимизировал запрос (еле как)
$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
проверьте индексы на owa_document.id owa_request.document_id и
owa_document.url

2. как сделать чтобы в итоге с этого запроса получать COUNT (записей) ? »
если возвращаются строки, то mysql_num_rows (PHP), иначе SELECT SQL_CALC_FOUND_ROWS ... с последующим SELECT FOUND_ROWS()




© OSzone.net 2001-2012