Como hacer Sql Complejas correctamente ?

Hola, Soy Rimobi

Llevo 2 semanas usando Yii y no tengo mucha experiencia aun.

Estoy haciendo un proyecto de final de curso de 2º DAI.

Una INTRANET centrada en la gestión de protocolos así como los distintos trabajo apartir de dichos protocolos.

Como tengo distintos roles, y cada empleado podra ver distintas cosas. Las Select´s se me quedan

en cierta medida complejas.




$sql = "SELECT * FROM PROTO WHERE ORIGEN IN(SELECT IDTYPETRABAJO FROM IDJALON 

WHERE IDEPT =".Yii::app()->user->getState("dept").") 

AND TIPO='T' AND estadototal = (SELECT FASE FROM TYPEJALON 

                                WHERE IDTYPETRABAJO = PROTO.ORIGEN 

                                 AND DEPT = ".Yii::app()->user->getState("dept").")";


[size="2"]*sql sin testear[/size]



Claro no tengo mucha idea del Yii

y me monto los DataProvider a pedal xDDD





$sq = "FROM `typetrabajo` WHERE `idtypetrabajo` in (select `idtypetrabajo` from  deptassig where idDept =".Yii::app()->user->getState("dept").")";

$count=Yii::app()->db->createCommand("SELECT COUNT(*) ".$sq)->queryScalar();

//$count =2;

$sql='SELECT idtypetrabajo , nombre ,	descrip '.$sq;


//echo $sql ;

//die;

$dataProvider=new CSqlDataProvider($sql, array(

    'totalItemCount'=>$count,

    'sort'=>array(

        'attributes'=>array(

             'idtypetrabajo', 'nombre', 'descrip',

        ),

    ),

    'pagination'=>array(

        'pageSize'=>5,

    ),

));




Gracias de antemano.

A tu código que ando viendo, no estas ejecutando el sql estan haciendo referencia a esa cadena de sql, pero te falta ejecutarlo con execute() osea:




//Tu lo indicas de esta manera:

$count=Yii::app()->db->createCommand("SELECT COUNT(*) ".$sq)->queryScalar()

//Te falta ejecutarlo al final

$count=Yii::app()->db->createCommand("SELECT COUNT(*) ".$sq)->queryScalar()->execute()

//No he probado eso del queryScalar pero tu nada mas estas indicando tu sql con las instrucciones propias de YII que es correcto, pero despues de indicarlo debes de ejecutar tu sentencia SQL espero me haya dado a entender...



En lo particular te recomiendo que los hagas de esta manera a mi se me hace mas fácil y esta mucho mejor usando mas el frame:




$user = Yii::app()->db->createCommand()->select('id_perfil, id_modulo')->from('Modulo_Detalles')

		->where('id_perfil=:id_perfil',array(':id_perfil'=>$model->id_perfil))->queryAll();



Si analizas el código es de una manera mas fácil de realizarlo utilizando el propio frame, solo pones tus id, tu tabla, le dices que quieres obtener en especifico en el where en base a una arreglo lo obtienes si te fijas pongo un array luego del where y ya al final le indico el sql que necesito de esta manera ya me mostro mi sql que necesito y me muestra el arreglo de los datos $model es el objeto al cuál tu haras referencia osea imaginatelo:




array(':id_perfil'=>1)

// o en vez de un 1 pon un 2 aki yo lo ando comparando con mi ID esta forma es correcta y es funcional.



Saludos.

Perfecto. shaolin esto es un poco lo que buscaba.

No me parece dificil , es cuestión de acostrumbrarse.




$user = Yii::app()->db->createCommand()->select('id_perfil, id_modulo')->from('Modulo_Detalles')

                ->where('id_perfil=:id_perfil',array(':id_perfil'=>$model->id_perfil))->queryAll();



¿Como podría añadir subconsultas?

He realizado todo el proyecto con este metodo y funciona, pero alomejor no es lo mas correcto

Anotare tu consejo y lo usare en las siguiente consultas.




//Tu lo indicas de esta manera:

$count=Yii::app()->db->createCommand("SELECT COUNT(*) ".$sq)->queryScalar()



Gracias, x todo.

La manera en la que me preguntas no la he estudiado… ya que también soy novato, pero estuve leyendo en el mismo foro y para una consulta mas en especifico vi que la realizan de esta manera:




        Yii::app()->db->createCommand($sql)->query();



Y a lo que dicen en los foros ps si es comprensible y logico solo que tengas cuidado con los alias.




SELECT 

p.COMMENTS, v.COMMENTS 

FROM PRODUCTS p 

LEFT OUTER JOIN VENDOR v ON v.VEN_UID = p.VEN_ID






SELECT 

PRODUCTS.COMMENTS AS COMMENTS_1, VENDOR.COMMENTS AS COMMENTS_2

FROM PRODUCTS 

LEFT OUTER JOIN VENDOR ON VENDOR.VEN_UID = PRODUCTS.VEN_ID






SELECT 

PRODUCTS.COMMENTS AS COMMENTS_1, VENDOR.COMMENTS AS COMMENTS_2

FROM PRODUCTS 

LEFT OUTER JOIN VENDOR ON VENDOR.VEN_UID = PRODUCTS.VEN_ID



Te indique diferentes maneras en las cuales meterias dentro de tu variable $sql, nada mas sería cuestión de que las estudies de la otra manera en la que te lo indique la verdad no tengo idea aún de como hacerlo aunque lo he estado buscando… Saludos.

Perfecto pues, lo estaba haciendo mas o menos bien… xDD

Yo se SQL pero de ORACLE vamos que tengo ciertas manias y cosas que alomejor no son las tipicas en MySql.

Gracias por la respuesta enserio. Me guardare el Post para tenerlo en cuenta.

Alguien tiene idea de como imprimir eso en la vista…como quedarían los tres archivos, el del modelo, la vista y el controlador una vez ejecutada la consulta???

Hola, por si a alguien le sirve, ya que estuve buscando esto mismo y ya lo pude hacer, tomando código de distintos lugares:

Modelo (Liquidacion, este es el nombre de mi modelo)


public function liquidar($parametro1, $parametro2)

	{

            $sql = "SELECT campo1, campo2, campo3 FROM tabla WHERE campo4='$parametro1' AND campo5='$parametro2'";            

            

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

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

            $dataReader = $command->queryAll();

            return $dataReader;

	}

Vista




<table>

    <tr>

        <td>Campo 1</td>

        <td>Campo 2</td>

        <td>Campo 3</td>

    </tr>

    <tr>

        <?php

        for($i =0; $i <= count($liquidacion); $i++)

        {

            ?>

            <tr>

                <td><?php echo $liquidacion[$i][campo1] ?></td>

                <td><?php echo $liquidacion[$i][campo2] ?></td>

                <td><?php echo $liquidacion[$i][campo3] ?></td>

            </tr>

            <?php

        }

        ?>

    </tr>

</table>

Controlador


public function actionLiquidar()

        {

            $this->_atributo1 = $_POST['variable1'];

            $this->_atributo2 = $_POST['variable2'];

            

            $liquidacion = Liquidacion::model()->liquidar($this->_atributo1, $this->_atributo2);

            $this->renderPartial('_liquidar', array ('liquidacion'=>$liquidacion));

        }