Para obtener totales de una tabla, con ciertos filtros hice unas sentencias que muestro a continuacion...
--
-- 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
Bueno desconozco la estructura de tu tabla pero... haz pensado utilizar BETWEEN?
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.
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
`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]
--
-- 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;
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:
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:
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 ;)
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
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:
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:
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:
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 :-*
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.