[Solved] Cdbcommand Failed To Execute The Sql Statement: Sqlstate[Hy000]: General Error

HI everyone.

I’m puzzled. This query executes just fine with phpMyAdmin and the console, but not in Yii.




public function obtener_alumnos($colegio_id, $ciclo_escolar_id, $nivel_id, $grado_id, $grupo_id, $activo) {

		switch($activo) {

			case 9:

				$filtro = '';

				break;

			case 0:

				$filtro = " and a.activo = '0' ";

				break;

			default:

				$filtro = " and a.activo = '1' ";

		}

		$q = "drop temporary table if exists alumno_articulo_tmp;

		create temporary table alumno_articulo_tmp

			select min(cap.articulo_id) as articulo_id, max(cap.articulo_id) as max_articulo_id,

						cap.grado_id, cap.grupo_id, cap.alumno_id

			from colegio_articulo_precio cap, colegio_nivel_ciclo cnc, colegio_grado_grupo cgg, alumno al,

				articulo a, tipo_articulo ta

			where cnc.colegio_id = $colegio_id

			and cnc.ciclo_escolar_id = $ciclo_escolar_id

			and cgg.grado_id = $grado_id

			and cgg.grupo_id = $grupo_id

			and cgg.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

			and al.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

			and al.colegio_grado_grupo_id = cgg.colegio_grado_grupo_id

			and cap.colegio_nivel_ciclo_id = cgg.colegio_nivel_ciclo_id

			and cap.grado_id = cgg.grado_id

			and cap.grupo_id in (0, cgg.grupo_id)

			and cap.alumno_id in (0, al.alumno_id)

			and a.articulo_id = cap.articulo_id

			and ta.tipo_articulo_id = a.tipo_articulo_id

			and ta.parametro not in ('IPAD')

			group by cap.grado_id, cap.grupo_id, cap.alumno_id;

		create index ak_alumno on alumno_articulo_tmp(alumno_id, grupo_id, grado_id);

		

		

		drop temporary table if exists alumno_tmp;

		create temporary table alumno_tmp

			select a.colegio_nivel_ciclo_id, a.colegio_grado_grupo_id, a.alumno_id, a.persona_id, a.hijo_profesor, a.activo,

				cgg.grado_id, cgg.grupo_id,

				0 as articulo_id, space(50) as articulo_clave, space(255) as articulo, space(50) as tipo_articulo_parametro

			from colegio_nivel_ciclo cnc, colegio_grado_grupo cgg, grado g, alumno a

			where cnc.colegio_id = $colegio_id

			and cnc.ciclo_escolar_id = $ciclo_escolar_id

			and g.grado_id = $grado_id

			and cgg.grupo_id = $grupo_id

			and cnc.nivel_id = g.nivel_id

			and cgg.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

			and cgg.grado_id = g.grado_id

			and a.colegio_nivel_ciclo_id = cgg.colegio_nivel_ciclo_id

			and a.colegio_grado_grupo_id = cgg.colegio_grado_grupo_id

		;

		create index ak_alumno on alumno_tmp(alumno_id);

		

		update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

			a.articulo_id = ar.articulo_id,

			a.articulo_clave = ar.articulo_clave,

			a.articulo = ar.articulo,

			a.tipo_articulo_parametro = ta.parametro

			where aa.alumno_id = a.alumno_id

			and aa.alumno_id > 0

			and aa.articulo_id = aa.max_articulo_id

			and ar.articulo_id = aa.articulo_id

			and ar.articulo_id > 0

			and ta.tipo_articulo_id = ar.tipo_articulo_id;

		update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

			a.articulo_id = aa.articulo_id,

			a.articulo_clave = ar.articulo_clave,

			a.articulo = ar.articulo,

			a.tipo_articulo_parametro = ta.parametro

			where aa.grupo_id = a.grupo_id

			and aa.grupo_id > 0

			and aa.alumno_id = 0

			and aa.articulo_id = aa.max_articulo_id

			and ar.articulo_id = aa.articulo_id

			and ar.articulo_id > 0

			and a.articulo_id = 0

			and ta.tipo_articulo_id = ar.tipo_articulo_id;

		update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

			a.articulo_id = aa.articulo_id,

			a.articulo_clave = ar.articulo_clave,

			a.articulo = ar.articulo,

			a.tipo_articulo_parametro = ta.parametro

			where aa.grado_id = a.grado_id

			and aa.grado_id > 0

			and aa.grupo_id = 0

			and aa.alumno_id = 0

			and aa.articulo_id = aa.max_articulo_id

			and ar.articulo_id = aa.articulo_id

			and ar.articulo_id > 0

			and a.articulo_id = 0

			and ta.tipo_articulo_id = ar.tipo_articulo_id;

		

		select a.colegio_grado_grupo_id, a.alumno_id, a.persona_id, p.persona, p.apellido_paterno, p.apellido_materno,

				p.dia_nacimiento, p.mes_nacimiento, p.anio_nacimiento, p.sexo_o_moral, a.hijo_profesor, a.activo,

				(select count(*) from documento d, documento_linea dl

						where dl.documento_id = d.documento_id

							and dl.alumno_id = a.alumno_id) as documentos,

				(select count(*) from documento d, documento_linea dl

						where dl.documento_id = d.documento_id

							and dl.alumno_id = a.alumno_id

							and d.aplicado = 1) as documentos_aplicados,

				(select case when count(*) > 0 then 1 else 0 end from alumno ax

						where ax.persona_id = a.persona_id

							and ax.colegio_nivel_ciclo_id <> a.colegio_nivel_ciclo_id) as promovido,

				a.articulo_id, a.articulo_clave, a.articulo, a.tipo_articulo_parametro

			from alumno_tmp a, persona p

			where p.persona_id = a.persona_id

			order by p.apellido_paterno, p.apellido_materno, p.persona

		";

		$r = Yii::app()->db->createCommand($q)->queryAll();

		if ($r !== FALSE) {

			if (sizeof($r) > 0) {

				foreach($r as $resultado) {

					$data[] = $resultado;

					if ($resultado['activo'] == 1) {

						$total ++;

						if ($resultado['hijo_profesor'] == 1) {

							$hijos_profesores ++;

						}

					}

				}

				if ($total > 0) {

					if ($hijos_profesores > 0) {

						$porcentaje_hijos = round(($hijos_profesores / $total) * 100);

					} else {

						$porcentaje_hijos = 0;

					}

				}

			}

		} else {

			

		}

		return array('resultado'=>$data, 'porcentaje_hijos'=>$porcentaje_hijos);

	}



Yii says:




CDbException


CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error. The SQL statement executed was: drop temporary table if exists alumno_articulo_tmp;

create temporary table alumno_articulo_tmp

select min(cap.articulo_id) as articulo_id, max(cap.articulo_id) as max_articulo_id,

cap.grado_id, cap.grupo_id, cap.alumno_id

from colegio_articulo_precio cap, colegio_nivel_ciclo cnc, colegio_grado_grupo cgg, alumno al,

articulo a, tipo_articulo ta

where cnc.colegio_id = 1599

and cnc.ciclo_escolar_id = 32

and cgg.grado_id = 85

and cgg.grupo_id = 298

and cgg.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

and al.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

and al.colegio_grado_grupo_id = cgg.colegio_grado_grupo_id

and cap.colegio_nivel_ciclo_id = cgg.colegio_nivel_ciclo_id

and cap.grado_id = cgg.grado_id

and cap.grupo_id in (0, cgg.grupo_id)

and cap.alumno_id in (0, al.alumno_id)

and a.articulo_id = cap.articulo_id

and ta.tipo_articulo_id = a.tipo_articulo_id

and ta.parametro not in ('IPAD')

group by cap.grado_id, cap.grupo_id, cap.alumno_id;

create index ak_alumno on alumno_articulo_tmp(alumno_id, grupo_id, grado_id);




drop temporary table if exists alumno_tmp;

create temporary table alumno_tmp

select a.colegio_nivel_ciclo_id, a.colegio_grado_grupo_id, a.alumno_id, a.persona_id, a.hijo_profesor, a.activo,

cgg.grado_id, cgg.grupo_id,

0 as articulo_id, space(50) as articulo_clave, space(255) as articulo, space(50) as tipo_articulo_parametro

from colegio_nivel_ciclo cnc, colegio_grado_grupo cgg, grado g, alumno a

where cnc.colegio_id = 1599

and cnc.ciclo_escolar_id = 32

and g.grado_id = 85

and cgg.grupo_id = 298

and cnc.nivel_id = g.nivel_id

and cgg.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

and cgg.grado_id = g.grado_id

and a.colegio_nivel_ciclo_id = cgg.colegio_nivel_ciclo_id

and a.colegio_grado_grupo_id = cgg.colegio_grado_grupo_id

;

create index ak_alumno on alumno_tmp(alumno_id);


update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

a.articulo_id = ar.articulo_id,

a.articulo_clave = ar.articulo_clave,

a.articulo = ar.articulo,

a.tipo_articulo_parametro = ta.parametro

where aa.alumno_id = a.alumno_id

and aa.alumno_id > 0

and aa.articulo_id = aa.max_articulo_id

and ar.articulo_id = aa.articulo_id

and ar.articulo_id > 0

and ta.tipo_articulo_id = ar.tipo_articulo_id;

update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

a.articulo_id = aa.articulo_id,

a.articulo_clave = ar.articulo_clave,

a.articulo = ar.articulo,

a.tipo_articulo_parametro = ta.parametro

where aa.grupo_id = a.grupo_id

and aa.grupo_id > 0

and aa.alumno_id = 0

and aa.articulo_id = aa.max_articulo_id

and ar.articulo_id = aa.articulo_id

and ar.articulo_id > 0

and a.articulo_id = 0

and ta.tipo_articulo_id = ar.tipo_articulo_id;

update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

a.articulo_id = aa.articulo_id,

a.articulo_clave = ar.articulo_clave,

a.articulo = ar.articulo,

a.tipo_articulo_parametro = ta.parametro

where aa.grado_id = a.grado_id

and aa.grado_id > 0

and aa.grupo_id = 0

and aa.alumno_id = 0

and aa.articulo_id = aa.max_articulo_id

and ar.articulo_id = aa.articulo_id

and ar.articulo_id > 0

and a.articulo_id = 0

and ta.tipo_articulo_id = ar.tipo_articulo_id;


select a.colegio_grado_grupo_id, a.alumno_id, a.persona_id, p.persona, p.apellido_paterno, p.apellido_materno,

p.dia_nacimiento, p.mes_nacimiento, p.anio_nacimiento, p.sexo_o_moral, a.hijo_profesor, a.activo,

(select count(*) from documento d, documento_linea dl

where dl.documento_id = d.documento_id

and dl.alumno_id = a.alumno_id) as documentos,

(select count(*) from documento d, documento_linea dl

where dl.documento_id = d.documento_id

and dl.alumno_id = a.alumno_id

and d.aplicado = 1) as documentos_aplicados,

(select case when count(*) > 0 then 1 else 0 end from alumno ax

where ax.persona_id = a.persona_id

and ax.colegio_nivel_ciclo_id <> a.colegio_nivel_ciclo_id) as promovido,

a.articulo_id, a.articulo_clave, a.articulo, a.tipo_articulo_parametro

from alumno_tmp a, persona p

where p.persona_id = a.persona_id

order by p.apellido_paterno, p.apellido_materno, p.persona



Why? Any ideas?

Thanks

I don’t think you can run multiple separate queries in one request.

Ok, I’ll try executing them separately, thanks Keith.

Ok, the thing is, I can’t execute ALL the queries together.

So, I had to split my query in two chunks:




// prepare my temporary table


$q = "drop temporary table if exists alumno_articulo_tmp;

	create temporary table alumno_articulo_tmp

		select min(cap.articulo_id) as articulo_id, max(cap.articulo_id) as max_articulo_id,

					cap.grado_id, cap.grupo_id, cap.alumno_id

		from colegio_articulo_precio cap, colegio_nivel_ciclo cnc, colegio_grado_grupo cgg, alumno al,

			articulo a, tipo_articulo ta

		where cnc.colegio_id = $colegio_id

		and cnc.ciclo_escolar_id = $ciclo_escolar_id

		and cgg.grado_id = $grado_id

		and cgg.grupo_id = $grupo_id

		and cgg.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

		and al.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

		and al.colegio_grado_grupo_id = cgg.colegio_grado_grupo_id

		and cap.colegio_nivel_ciclo_id = cgg.colegio_nivel_ciclo_id

		and cap.grado_id = cgg.grado_id

		and cap.grupo_id in (0, cgg.grupo_id)

		and cap.alumno_id in (0, al.alumno_id)

		and a.articulo_id = cap.articulo_id

		and ta.tipo_articulo_id = a.tipo_articulo_id

		and ta.parametro not in ('IPAD')

		group by cap.grado_id, cap.grupo_id, cap.alumno_id;

	create index ak_alumno on alumno_articulo_tmp(alumno_id, grupo_id, grado_id);

	

	drop temporary table if exists alumno_tmp;

	create temporary table alumno_tmp

		select a.colegio_nivel_ciclo_id, a.colegio_grado_grupo_id, a.alumno_id, a.persona_id, a.hijo_profesor, a.activo,

			cgg.grado_id, cgg.grupo_id,

			0 as articulo_id, space(50) as articulo_clave, space(255) as articulo, space(50) as tipo_articulo_parametro

		from colegio_nivel_ciclo cnc, colegio_grado_grupo cgg, grado g, alumno a

		where cnc.colegio_id = $colegio_id

		and cnc.ciclo_escolar_id = $ciclo_escolar_id

		and g.grado_id = $grado_id

		and cgg.grupo_id = $grupo_id

		and cnc.nivel_id = g.nivel_id

		and cgg.colegio_nivel_ciclo_id = cnc.colegio_nivel_ciclo_id

		and cgg.grado_id = g.grado_id

		and a.colegio_nivel_ciclo_id = cgg.colegio_nivel_ciclo_id

		and a.colegio_grado_grupo_id = cgg.colegio_grado_grupo_id

	;

	create index ak_alumno on alumno_tmp(alumno_id);

	

	update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

		a.articulo_id = ar.articulo_id,

		a.articulo_clave = ar.articulo_clave,

		a.articulo = ar.articulo,

		a.tipo_articulo_parametro = ta.parametro

		where aa.alumno_id = a.alumno_id

		and aa.alumno_id > 0

		and aa.articulo_id = aa.max_articulo_id

		and ar.articulo_id = aa.articulo_id

		and ar.articulo_id > 0

		and ta.tipo_articulo_id = ar.tipo_articulo_id;

	update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

		a.articulo_id = aa.articulo_id,

		a.articulo_clave = ar.articulo_clave,

		a.articulo = ar.articulo,

		a.tipo_articulo_parametro = ta.parametro

		where aa.grupo_id = a.grupo_id

		and aa.grupo_id > 0

		and aa.alumno_id = 0

		and aa.articulo_id = aa.max_articulo_id

		and ar.articulo_id = aa.articulo_id

		and ar.articulo_id > 0

		and a.articulo_id = 0

		and ta.tipo_articulo_id = ar.tipo_articulo_id;

	update alumno_tmp a, alumno_articulo_tmp aa, articulo ar, tipo_articulo ta set

		a.articulo_id = aa.articulo_id,

		a.articulo_clave = ar.articulo_clave,

		a.articulo = ar.articulo,

		a.tipo_articulo_parametro = ta.parametro

		where aa.grado_id = a.grado_id

		and aa.grado_id > 0

		and aa.grupo_id = 0

		and aa.alumno_id = 0

		and aa.articulo_id = aa.max_articulo_id

		and ar.articulo_id = aa.articulo_id

		and ar.articulo_id > 0

		and a.articulo_id = 0

		and ta.tipo_articulo_id = ar.tipo_articulo_id;";

	

// Notice that building and executing is now two steps

// 1. create the command

$command = Yii::app()->db->createCommand($q);


// 2. execute the command

$n = $command->execute();


// 3. New step: reset the command

$command = false;

	

// Now, execute query on my temporary table


$q = "select a.colegio_grado_grupo_id, a.alumno_id, a.persona_id, p.persona, p.apellido_paterno, p.apellido_materno,

		p.dia_nacimiento, p.mes_nacimiento, p.anio_nacimiento, p.sexo_o_moral, a.hijo_profesor, a.activo,

		(select count(*) from documento d, documento_linea dl

				where dl.documento_id = d.documento_id

					and dl.alumno_id = a.alumno_id) as documentos,

		(select count(*) from documento d, documento_linea dl

				where dl.documento_id = d.documento_id

					and dl.alumno_id = a.alumno_id

					and d.aplicado = 1) as documentos_aplicados,

		(select case when count(*) > 0 then 1 else 0 end from alumno ax

				where ax.persona_id = a.persona_id

					and ax.colegio_nivel_ciclo_id <> a.colegio_nivel_ciclo_id) as promovido,

		a.articulo_id, a.articulo_clave, a.articulo, a.tipo_articulo_parametro

	from alumno_tmp a, persona p

	where p.persona_id = a.persona_id

	order by p.apellido_paterno, p.apellido_materno, p.persona

";


// Finally, this commands executes as it should, no problem

$r = Yii::app()->db->createCommand($q)->queryAll();