MySQL select con mas selects?

Iniciado por Azielito, 29 Septiembre 2009, 20:13 PM

0 Miembros y 1 Visitante están viendo este tema.

Azielito

Para obtener totales de una tabla, con ciertos filtros hice unas sentencias que muestro a continuacion...
Código (sql) [Seleccionar]
--
-- Totales.
--

-- administrativos y estatales en sala 4
SELECT count(id_jui) as total, sal_jui FROM `juicio` WHERE tip_jui=1 AND aut_jui=1 AND sal_jui=4 or sal_jui=10 group by sal_jui order by sal_jui asc limit 1;
-- adminstrativos y estatales en sala 10
SELECT count(id_jui) as total, sal_jui FROM `juicio` WHERE tip_jui=1 AND aut_jui=1 AND sal_jui=4 or sal_jui=10 group by sal_jui order by sal_jui desc limit 1;

-- administrativos municipales en sala 4
SELECT count(id_jui) as total, sal_jui FROM `juicio` WHERE tip_jui=1 AND aut_jui=2 AND sal_jui=4 or sal_jui=10 group by sal_jui order by sal_jui asc limit 1;
-- administrativos municipales en sala 10
SELECT count(id_jui) as total, sal_jui FROM `juicio` WHERE tip_jui=1 AND aut_jui=2 AND sal_jui=4 or sal_jui=10 group by sal_jui order by sal_jui desc limit 1;

-- fiscales estatales sala 4
SELECT count(id_jui) as total, sal_jui FROM `juicio` WHERE tip_jui=2 AND aut_jui=1 AND sal_jui=4 or sal_jui=10 group by sal_jui order by sal_jui asc limit 1;
-- fiscales estatales sala 10
SELECT count(id_jui) as total, sal_jui FROM `juicio` WHERE tip_jui=2 AND aut_jui=1 AND sal_jui=4 or sal_jui=10 group by sal_jui order by sal_jui desc limit 1;

-- fiscales municipales sala 4
SELECT count(id_jui) as total, sal_jui FROM `juicio` WHERE tip_jui=2 AND aut_jui=2 AND sal_jui=4 or sal_jui=10 group by sal_jui order by sal_jui asc limit 1;
-- fiscales municipales sala 10
SELECT count(id_jui) as total, sal_jui FROM `juicio` WHERE tip_jui=2 AND aut_jui=2 AND sal_jui=4 or sal_jui=10 group by sal_jui order by sal_jui desc limit 1;


De esa forma obtengo el toal de "juicios" por tipo de juicio [administrativo|fiscal] y ademas por tipo de autoridad [estatal|municipal] de cada sala [4|10] xD

Ahora mismo me doy cuenta que se puede optimisar quitando el order by y una sala :xD

el punto es, se pueden uni erstas consultas en una sola? asi podre traer los todos datos ya en un arreglo, y no enviar una consulta cada vez =\

vi el "UNION" pero no me funciono :xD!

Saludos y gracias por su atencion :D

^Tifa^

Bueno desconozco la estructura de tu tabla pero... haz pensado utilizar BETWEEN?

Código (sql) [Seleccionar]


SELECT count(id_jui) AS total, sal_jui FROM `juicio` WHERE tip_jui BETWEEN 1 AND 2 AND  aut_jui BETWEEN 1 AND 2 AND sal_jui=4 OR sal_jui=10 GROUP BY sal_jui ORDER BY sal_jui ASC LIMIT 1;



No se es una idea, sin saber que estas buscando con exactitud o como esta estructurada la tabla es poco lo que puedo ofrecer  :P  para pasarle tunning de indices a las consultas SQL recuerda utilizar 'EXPLAIN' para evaluar  ;)  te servira bastante para optimizaciones.

Azielito

#2
La verda es que soy muy malo para eso de las bases de datos xD

Mira, basicamente lo que quiero es saber cuantos "juicios" [tip_jui(administrativos|fiscales)] hay, y de estos saber cuantos son [aut_jui(estatales|municipales)] y a su vez por sala [4|10) para despues hacer comparativos...

si la sala 10 tiene ya muchos "administrativos estatales" entonces le toca insertar el siguiente "administrativo estatal" a la sala 4, y asi cada uno [administrativo municial, fiscal estatal, fiscal municipal]


la tabla es esta
Código (sql) [Seleccionar]
 `id_jui` int(9) NOT NULL auto_increment COMMENT 'identificador',
 `fec_jui` date NOT NULL COMMENT 'fecha',
 `tip_jui` int(1) NOT NULL COMMENT 'tipo de juicio',
 `acto_jui` varchar(250) NOT NULL COMMENT 'acto impugnado',
 `cons_jui` varchar(11) NOT NULL COMMENT 'consecutivo anual',
 `anex_jui` varchar(250) NOT NULL COMMENT 'anexos',
 `exp_jui` varchar(250) NOT NULL COMMENT 'expediente',
 `act_jui` varchar(250) NOT NULL COMMENT 'actor',
 `aut_jui` int(1) NOT NULL COMMENT 'tipo autoridad',
 `aut_id_jui` int(4) NOT NULL COMMENT 'ID de autoridad',
 `sal_jui` int(4) NOT NULL COMMENT 'Sala',
 `status` int(1) NOT NULL default '1' COMMENT 'Estado en que se encuentra',
 `ter_jui` date NOT NULL COMMENT 'Fecha de Termino',
 `fav_jui` int(1) NOT NULL COMMENT 'A favor de...',
 PRIMARY KEY  (`id_jui`),
 FULLTEXT KEY `acto_jui` (`acto_jui`,`exp_jui`)






y en realidad no es tan complicado, al final las sentencias me quedaron asi [independientes]
Código (sql) [Seleccionar]
--
-- Totales.
--

-- administrativos y estatales en sala 4
SELECT count(id_jui) as total FROM `juicio` WHERE tip_jui=1 AND aut_jui=1 AND sal_jui=4 limit 1;
-- adminstrativos y estatales en sala 10
SELECT count(id_jui) as total FROM `juicio` WHERE tip_jui=1 AND aut_jui=1 AND sal_jui=10 limit 1;

-- administrativos municipales en sala 4
SELECT count(id_jui) as total FROM `juicio` WHERE tip_jui=1 AND aut_jui=2 AND sal_jui=4 limit 1;
-- administrativos municipales en sala 10
SELECT count(id_jui) as total FROM `juicio` WHERE tip_jui=1 AND aut_jui=2 AND sal_jui=10 limit 1;

-- fiscales estatales sala 4
SELECT count(id_jui) as total FROM `juicio` WHERE tip_jui=2 AND aut_jui=1 AND sal_jui=4 limit 1;
-- fiscales estatales sala 10
SELECT count(id_jui) as total FROM `juicio` WHERE tip_jui=2 AND aut_jui=1 AND sal_jui=10 limit 1;

-- fiscales municipales sala 4
SELECT count(id_jui) as total FROM `juicio` WHERE tip_jui=2 AND aut_jui=2 AND sal_jui=4 limit 1;
-- fiscales municipales sala 10
SELECT count(id_jui) as total FROM `juicio` WHERE tip_jui=2 AND aut_jui=2 AND sal_jui=10 limit 1;

^Tifa^

Yo soy mala para comprender muchas veces lo que me preguntan...no eres unico  :P

Lo que ocurre que con la sentencia que te ofreci:

Código (sql) [Seleccionar]


SELECT count(id_jui) AS total, sal_jui FROM `juicio` WHERE tip_jui BETWEEN 1 AND 2 AND  aut_jui BETWEEN 1 AND 2 AND sal_jui IN(4,10) LIMIT 1;



No te especifica cuando el dato pertenece a tip_jui = 1 o tip_jui = 2 la misma condicion aplica para aut_jui el no te dice cual pertenece a cual, aunque el resultado te lo presentara en pantalla. Tu lo que quieres es agregar en variables por cada condicion, podrias optar por un PL digase usar un bucle FOR y pasarle parametros para que cuente las condiciones y estas sean asignadas por ejemplo a 2 variables, un mero y ultra sencillo ejemplo:

Código (sql) [Seleccionar]


FOR parametro..2 LOOP
SET @variable(parametro) := SELECT count(id_jui) AS total, sal_jui FROM `juicio` WHERE tip_jui = parametro AND  aut_jui = parametro AND sal_jui IN(4,10) LIMIT 1;




Es un mero ejemplo, la sintaxis no va asi pero ando un pelin rapida  ;)

Azielito

No he manejado eso, nunca :xD! como lo aplico para obtener los datos a variables de PHP? ._.

no encontre un FOR en el manual de referencia de MySQL
http://search.mysql.com/search?site=refman-50&q=FOR&lr=lang_es

pero si encontre el while :')
http://dev.mysql.com/doc/refman/5.0/es/while-statement.html


^Tifa^

Analizandolo bien, te convendria un cursor mejor.

Admito que estoy debil en cursores en MySQL ya que me dedico mas al PL/SQL de Oracle que de MySQL, por ende tuve que buscar referencias de sintaxis de cursor en MySQL para guiarme. Esto a lo mejor te pueda ayudar (un analista programador podria convertir lo siguiente en sus necesidades):

Imaginate que tengo esta tabla y estos datos:

Código (sql) [Seleccionar]


mysql> select * from juicio;
+--------+---------+---------+---------+
| id_jui | tip_jui | aut_jui | sal_jui |
+--------+---------+---------+---------+
|      1 |       1 |       1 |       4 |
|      1 |       1 |       1 |       4 |
|      1 |       1 |       1 |       4 |
|      1 |       1 |       1 |      10 |
|      1 |       1 |       1 |      10 |
|      1 |       2 |       2 |      10 |
|      1 |       2 |       2 |      10 |
|      1 |       2 |       2 |      10 |
|      1 |       2 |       2 |       4 |
+--------+---------+---------+---------+
9 rows in set (0.00 sec)



Ahora creo un procedimiento almacenado con un cursor:

Código (sql) [Seleccionar]


mysql> delimiter /
mysql>     create procedure hongo(p1 int, p2 int, p3 int)
    ->     begin                                         
    ->     declare terminado int default 0;             
    ->     declare b,c int;                             
    ->     declare cur1 cursor for SELECT count(id_jui) FROM `juicio` WHERE tip_jui = p1  AND     aut_jui = p1  AND sal_jui = p3;
    ->     declare cur2 cursor for SELECT count(id_jui) FROM `juicio` WHERE tip_jui = p2  AND  aut_jui = p2  AND sal_jui = p3;
    ->     declare continue handler for sqlstate '02000' set terminado = 1;                                                   
    ->     open cur1;                                                                                                         
    ->     open cur2;                                                                                                         
    ->     repeat                                                                                                             
    ->     fetch cur1 into b;                                                                                                 
    ->     set @todo1 := b;                                                                                                   
    ->     fetch cur2 into c;                                                                                                 
    ->     set @todito1 := c;                                                                                                 
    ->     until terminado end repeat;                                                                                       
    ->     close cur1;                                                                                                       
    ->     close cur2;                                                                                                       
    ->     end;                                                                                                               
    ->     /                                                                                                                 
Query OK, 0 rows affected (0.00 sec)                                                                                         

mysql> delimiter ;



Un procedimiento que soporta 3 parametros, dichos parametros pueden ir entre 1,1,10 o 2,2,4 como tu ejemplo expone, por ejemplo:

Código (sql) [Seleccionar]


mysql> call hongo(1,2,10);                                                                       
Query OK, 0 rows affected (0.00 sec)

mysql> select @todo1;
+--------+
| @todo1 |
+--------+
| 2      |
+--------+
1 row in set (0.00 sec)

mysql> select @todito1;
+----------+
| @todito1 |
+----------+
| 3        |
+----------+
1 row in set (0.00 sec)

mysql> call hongo(2,2,4);
Query OK, 0 rows affected (0.00 sec)

mysql> select @todo1;
+--------+
| @todo1 |
+--------+
| 1      |
+--------+
1 row in set (0.00 sec)

mysql> select @todito1;
+----------+
| @todito1 |
+----------+
| 1        |
+----------+
1 row in set (0.00 sec)




Analizalo  :-*

^Tifa^

Se que no me explique de que iba el asunto, los parametros del procedimiento creo que esa parte la tendras clara, seran los numeros 1 o 2 que le pasas a la consulta SQL mas el ultimo 4 o 10.

Cada dato recogido es guardado como te fijas en variables @todo1 y @todito1 entonces, para obtener esos valores solo llamas dichas variables (primero ejecutando el procedimiento claro) desde el codigo php y te refleja el resultado  ;)  no se si entiendes del todo, pero he tratado.