[RESUELTO] - Problemas Ejecutando SQL


(Jam Franco) #1

Buenas Tardes mi problema es Simple intento ejecutar una sentencia SQL y me da error, esta es la sentencia SQL:

SET @rownum = 0;

select rank from (SELECT usda_code, @rownum:=@rownum+1 rank FROM user_data order by usda_punctuation desc, usda_level desc, usda_code asc) as ranking where usda_code=15

Como pueden ver declaro una variable SET @rownum = 0;

Y luego la Uso @rownum:=@rownum+1 rank.

Si ejecuto este SQL en mi consola funciona sin problema pero Yii me da el siguente error:

CDbException

Descripción

CDbCommand falló al ejecutar la sentencia SQL: SQLSTATE[HY000]: General error

Archivo Fuente:

C:\wamp\www\yii-1.1.0.r1700\framework\db\CDbCommand.php(375)

00363: }

00364:

00365: if($this->_connection->enableProfiling)

00366: Yii::endProfile(‘system.db.CDbCommand.query(’.$this->getText().’)’,‘system.db.CDbCommand.query’);

00367:

00368: return $result;

00369: }

00370: catch(Exception $e)

00371: {

00372: if($this->_connection->enableProfiling)

00373: Yii::endProfile(‘system.db.CDbCommand.query(’.$this->getText().’)’,‘system.db.CDbCommand.query’);

00374: Yii::log('Error in querying SQL: '.$this->getText().$par,CLogger::LEVEL_ERROR,‘system.db.CDbCommand’);

00375: throw new CDbException(Yii::t(‘yii’,‘CDbCommand failed to execute the SQL statement: {error}’,

00376: array(’{error}’=>$e->getMessage())));

00377: }

00378: }

00379: }

De ante mano Gracias por la colaboración.


(Cyberpol 777) #2

Que motor estas usando?

Y por otro lado, como estas eecutando el query desde yii?

Podrias mostrarnos un extracto de tu codigo?


(Jam Franco) #3

EL motor es MYSQL

Y la version de Yii es yii-1.1.0.r1700

$data=UserData::model()->findbySql(’

			SET @rownum = 0;


			select rank from (SELECT usda_code, @rownum:=@rownum+1 rank FROM user_data order by usda_punctuation desc, usda_level desc, usda_code asc) as ranking where usda_code= '.$usda_code);


	return $data->rank;

(Cyberpol 777) #4

Pienso que tenes el siguiente:

No creo que el PDO permite multiples ejecuciones.

Quiero decir, estas intentando ejecutar dos "instrucciones":

a. SET @rownum = 0;

b. El select.

Por otro lado estoy intrigado con esta parte del query:

SELECT usda_code, @rownum:=@rownum+1 rank FROM user_data order by usda_punctuation desc, usda_level desc, usda_code asc

Seguro que es ‘:= ??[b]

[/b]Nunca use variables seteadas en mysql, po eso pregunto…

[b]

[/b]


(Jam Franco) #5

Si PoL, al ejecutar en mi mysql el resultado esta bien

que recomiendas que las ejecute por separado

??


(Cyberpol 777) #6

Si, proba ejecutandolas por separado:




$connection = Yii::app()->db;

$sql = "SET @rownum = 0;";

$command=$connection->createCommand($sql);

$command->execute();

// Y despues

$data=UserData::model()->findbySql('

				SET @rownum = 0;

				select rank from (SELECT usda_code, @rownum:=@rownum+1 rank FROM user_data order by usda_punctuation desc, usda_level desc, usda_code asc) as ranking where usda_code= '.$usda_code);

		return $data->rank;												



Aunque no se si va a funcionar…


(Jam Franco) #7

Hola PoL, tu solución no funciono pero si me dio una Idea. Muchas Gracias.

la solución fue:

$fisrt=UserData::model()->findbySql(‘select @rownum:=0 from dual’);

	$data=UserData::model()->findbySql('


                            select rank from (SELECT usda_code, @rownum:=@rownum+1 rank FROM user_data order by usda_punctuation desc, usda_level desc, usda_code asc) as ranking where usda_code= '.$usda_code);


return $data->rank;

(Cyberpol 777) #8

Bueno, lo imporante es que lo resolviste!!! :D

P.D.: Bienvenido al foro!!!


(Cm5775) #9

Hola, jamfranco…

La respuesta ya es un poco tardía, pero para la próxima vez podés intentar lo siguiente para no tener que ejecutar dos sentencias:

ANTES:




SET @rownum = 0;


select  rank

from    (   SELECT  usda_code,

                    @rownum:=@rownum+1 rank

            FROM    user_data

            order by  usda_punctuation desc,

                      usda_level desc,

                      usda_code asc

        ) as ranking

where   usda_code= '.$usda_code);



DESPUÉS:




select  rank

from    (   SELECT  usda_code,

                    @rownum:=@rownum+1 rank

            FROM    user_data,

                    (select (@rownum := 0)) as lag

            order by  usda_punctuation desc,

                      usda_level desc,

                      usda_code asc

        ) as ranking

where   usda_code= '.$usda_code);