Autor
|
Tema: MySQL select con mas selects? (Leído 6,405 veces)
|
Azielito
no es
Colaborador
Desconectado
Mensajes: 9.188
>.<
|
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 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 ! Saludos y gracias por su atencion
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
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 para pasarle tunning de indices a las consultas SQL recuerda utilizar 'EXPLAIN' para evaluar te servira bastante para optimizaciones.
|
|
|
En línea
|
|
|
|
Azielito
no es
Colaborador
Desconectado
Mensajes: 9.188
>.<
|
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;
|
|
« Última modificación: 29 Septiembre 2009, 20:54 pm por Azielito »
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Yo soy mala para comprender muchas veces lo que me preguntan...no eres unico 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
|
|
|
En línea
|
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
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
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[PHP+MYSQL] Sumar a una cifra mediante UPDATE, sin SELECT previo
PHP
|
Servia
|
3
|
24,689
|
29 Julio 2011, 00:53 am
por Shell Root
|
|
|
Problema al pasar a Mysql un Select
Bases de Datos
|
David Vans
|
3
|
4,171
|
1 Septiembre 2011, 04:55 am
por seba123neo
|
|
|
Selects dependientes 3 niveles con ajax
PHP
|
KateLibby
|
5
|
7,825
|
15 Noviembre 2013, 15:38 pm
por gowend
|
|
|
Ayuda PHP select dependiente PHP MySQL y Grafica
PHP
|
miguel20dh
|
0
|
2,136
|
6 Abril 2015, 17:40 pm
por miguel20dh
|
|
|
MYSQL Select según en que tabla se encuentra
Bases de Datos
|
patilanz
|
2
|
2,320
|
2 Diciembre 2018, 14:45 pm
por patilanz
|
|