elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  MySQL select con mas selects?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: MySQL select con mas selects?  (Leído 6,384 veces)
Azielito
no es
Colaborador
***
Desconectado Desconectado

Mensajes: 9.188


>.<


Ver Perfil WWW
MySQL select con mas selects?
« en: 29 Septiembre 2009, 20:13 pm »

Para obtener totales de una tabla, con ciertos filtros hice unas sentencias que muestro a continuacion...
Código
  1. --
  2. -- Totales.
  3. --
  4.  
  5. -- administrativos y estatales en sala 4
  6. 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;
  7. -- adminstrativos y estatales en sala 10
  8. 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;
  9.  
  10. -- administrativos municipales en sala 4
  11. 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;
  12. -- administrativos municipales en sala 10
  13. 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;
  14.  
  15. -- fiscales estatales sala 4
  16. 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;
  17. -- fiscales estatales sala 10
  18. 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;
  19.  
  20. -- fiscales municipales sala 4
  21. 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;
  22. -- fiscales municipales sala 10
  23. 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


En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: MySQL select con mas selects?
« Respuesta #1 en: 29 Septiembre 2009, 20:34 pm »

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

Código
  1.  
  2. 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;
  3.  
  4.  

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.


En línea

Azielito
no es
Colaborador
***
Desconectado Desconectado

Mensajes: 9.188


>.<


Ver Perfil WWW
Re: MySQL select con mas selects?
« Respuesta #2 en: 29 Septiembre 2009, 20:49 pm »

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
  1.  `id_jui` INT(9) NOT NULL AUTO_INCREMENT COMMENT 'identificador',
  2.  `fec_jui` DATE NOT NULL COMMENT 'fecha',
  3.  `tip_jui` INT(1) NOT NULL COMMENT 'tipo de juicio',
  4.  `acto_jui` VARCHAR(250) NOT NULL COMMENT 'acto impugnado',
  5.  `cons_jui` VARCHAR(11) NOT NULL COMMENT 'consecutivo anual',
  6.  `anex_jui` VARCHAR(250) NOT NULL COMMENT 'anexos',
  7.  `exp_jui` VARCHAR(250) NOT NULL COMMENT 'expediente',
  8.  `act_jui` VARCHAR(250) NOT NULL COMMENT 'actor',
  9.  `aut_jui` INT(1) NOT NULL COMMENT 'tipo autoridad',
  10.  `aut_id_jui` INT(4) NOT NULL COMMENT 'ID de autoridad',
  11.  `sal_jui` INT(4) NOT NULL COMMENT 'Sala',
  12.  `status` INT(1) NOT NULL DEFAULT '1' COMMENT 'Estado en que se encuentra',
  13.  `ter_jui` DATE NOT NULL COMMENT 'Fecha de Termino',
  14.  `fav_jui` INT(1) NOT NULL COMMENT 'A favor de...',
  15.  PRIMARY KEY  (`id_jui`),
  16.  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
  1. --
  2. -- Totales.
  3. --
  4.  
  5. -- administrativos y estatales en sala 4
  6. SELECT COUNT(id_jui) AS total FROM `juicio` WHERE tip_jui=1 AND aut_jui=1 AND sal_jui=4 LIMIT 1;
  7. -- adminstrativos y estatales en sala 10
  8. SELECT COUNT(id_jui) AS total FROM `juicio` WHERE tip_jui=1 AND aut_jui=1 AND sal_jui=10 LIMIT 1;
  9.  
  10. -- administrativos municipales en sala 4
  11. SELECT COUNT(id_jui) AS total FROM `juicio` WHERE tip_jui=1 AND aut_jui=2 AND sal_jui=4 LIMIT 1;
  12. -- administrativos municipales en sala 10
  13. SELECT COUNT(id_jui) AS total FROM `juicio` WHERE tip_jui=1 AND aut_jui=2 AND sal_jui=10 LIMIT 1;
  14.  
  15. -- fiscales estatales sala 4
  16. SELECT COUNT(id_jui) AS total FROM `juicio` WHERE tip_jui=2 AND aut_jui=1 AND sal_jui=4 LIMIT 1;
  17. -- fiscales estatales sala 10
  18. SELECT COUNT(id_jui) AS total FROM `juicio` WHERE tip_jui=2 AND aut_jui=1 AND sal_jui=10 LIMIT 1;
  19.  
  20. -- fiscales municipales sala 4
  21. SELECT COUNT(id_jui) AS total FROM `juicio` WHERE tip_jui=2 AND aut_jui=2 AND sal_jui=4 LIMIT 1;
  22. -- fiscales municipales sala 10
  23. 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 Desconectado

Mensajes: 2.804


Ver Perfil
Re: MySQL select con mas selects?
« Respuesta #3 en: 29 Septiembre 2009, 21:10 pm »

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
  1.  
  2. 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;
  3.  
  4.  

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
  1.  
  2. FOR parametro..2 LOOP
  3. 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;
  4.  
  5.  
  6.  

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

Azielito
no es
Colaborador
***
Desconectado Desconectado

Mensajes: 9.188


>.<


Ver Perfil WWW
Re: MySQL select con mas selects?
« Respuesta #4 en: 29 Septiembre 2009, 21:32 pm »

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

En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: MySQL select con mas selects?
« Respuesta #5 en: 30 Septiembre 2009, 03:13 am »

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
  1.  
  2. mysql> SELECT * FROM juicio;
  3. +--------+---------+---------+---------+
  4. | id_jui | tip_jui | aut_jui | sal_jui |
  5. +--------+---------+---------+---------+
  6. |      1 |       1 |       1 |       4 |
  7. |      1 |       1 |       1 |       4 |
  8. |      1 |       1 |       1 |       4 |
  9. |      1 |       1 |       1 |      10 |
  10. |      1 |       1 |       1 |      10 |
  11. |      1 |       2 |       2 |      10 |
  12. |      1 |       2 |       2 |      10 |
  13. |      1 |       2 |       2 |      10 |
  14. |      1 |       2 |       2 |       4 |
  15. +--------+---------+---------+---------+
  16. 9 ROWS IN SET (0.00 sec)
  17.  
  18.  

Ahora creo un procedimiento almacenado con un cursor:

Código
  1.  
  2. mysql> delimiter /
  3. mysql>     CREATE PROCEDURE hongo(p1 INT, p2 INT, p3 INT)
  4.    ->     BEGIN                                        
  5.    ->     DECLARE terminado INT DEFAULT 0;              
  6.    ->     DECLARE b,c INT;                              
  7.    ->     DECLARE cur1 cursor FOR SELECT COUNT(id_jui) FROM `juicio` WHERE tip_jui = p1  AND     aut_jui = p1  AND sal_jui = p3;
  8.    ->     DECLARE cur2 cursor FOR SELECT COUNT(id_jui) FROM `juicio` WHERE tip_jui = p2  AND  aut_jui = p2  AND sal_jui = p3;
  9.    ->     DECLARE continue handler FOR sqlstate '02000' SET terminado = 1;                                                  
  10.    ->     OPEN cur1;                                                                                                        
  11.    ->     OPEN cur2;                                                                                                        
  12.    ->     repeat                                                                                                            
  13.    ->     fetch cur1 INTO b;                                                                                                
  14.    ->     SET @todo1 := b;                                                                                                  
  15.    ->     fetch cur2 INTO c;                                                                                                
  16.    ->     SET @todito1 := c;                                                                                                
  17.    ->     until terminado END repeat;                                                                                        
  18.    ->     close cur1;                                                                                                        
  19.    ->     close cur2;                                                                                                        
  20.    ->     END;                                                                                                              
  21.    ->     /                                                                                                                  
  22. Query OK, 0 ROWS affected (0.00 sec)                                                                                          
  23.  
  24. mysql> delimiter ;
  25.  
  26.  

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
  1.  
  2. mysql> CALL hongo(1,2,10);                                                                      
  3. Query OK, 0 ROWS affected (0.00 sec)
  4.  
  5. mysql> SELECT @todo1;
  6. +--------+
  7. | @todo1 |
  8. +--------+
  9. | 2      |
  10. +--------+
  11. 1 ROW IN SET (0.00 sec)
  12.  
  13. mysql> SELECT @todito1;
  14. +----------+
  15. | @todito1 |
  16. +----------+
  17. | 3        |
  18. +----------+
  19. 1 ROW IN SET (0.00 sec)
  20.  
  21. mysql> CALL hongo(2,2,4);
  22. Query OK, 0 ROWS affected (0.00 sec)
  23.  
  24. mysql> SELECT @todo1;
  25. +--------+
  26. | @todo1 |
  27. +--------+
  28. | 1      |
  29. +--------+
  30. 1 ROW IN SET (0.00 sec)
  31.  
  32. mysql> SELECT @todito1;
  33. +----------+
  34. | @todito1 |
  35. +----------+
  36. | 1        |
  37. +----------+
  38. 1 ROW IN SET (0.00 sec)
  39.  
  40.  
  41.  

Analizalo  :-*
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: MySQL select con mas selects?
« Respuesta #6 en: 30 Septiembre 2009, 03:21 am »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[PHP+MYSQL] Sumar a una cifra mediante UPDATE, sin SELECT previo
PHP
Servia 3 24,669 Último mensaje 29 Julio 2011, 00:53 am
por Shell Root
Problema al pasar a Mysql un Select
Bases de Datos
David Vans 3 4,136 Último mensaje 1 Septiembre 2011, 04:55 am
por seba123neo
Selects dependientes 3 niveles con ajax
PHP
KateLibby 5 7,794 Último mensaje 15 Noviembre 2013, 15:38 pm
por gowend
Ayuda PHP select dependiente PHP MySQL y Grafica
PHP
miguel20dh 0 2,132 Último mensaje 6 Abril 2015, 17:40 pm
por miguel20dh
MYSQL Select según en que tabla se encuentra
Bases de Datos
patilanz 2 2,305 Último mensaje 2 Diciembre 2018, 14:45 pm
por patilanz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines