Comunidad de diseño web y desarrollo en internet online

Ayuda consulta Sql

Citar            
MensajeEscrito el 08 Mar 2010 10:06 pm
Tengo las tablas [TBL.OPERACIONES, TBL.ESTADOS] una operación tiene varios estados y necesito crear una consulta que me muestre todas las operaciones que tengan el estado 37 pero no el 38. Ej:

Código :

TBL.OPERACIONES
IDOPERACION    NRO   IDCLIENTE
1              5          85 
2              20         157


TBL.ESTADOS
IDOPERACION  ESTADO   OBSERVACIONES
1              37          NULL
2              37          NULL
1              38          NULL





LA CONSULTA EN ESTE CASO ME DEBERIA ARROJAR LA OPERACION IDOPERACION = 2 SOLAMENTE

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

firefox
Citar            
MensajeEscrito el 08 Mar 2010 11:34 pm

Código PHP :


$result="select * from noticias where importante='1' order by id_noticia";
 $totalregistros=mysql_num_rows($result);
 while($row=mysql_fetch_array($result)) {
 for($i = 1; $i <= $totalregistros; $i += 1)
 {
echo "me presente vivito y coleando y soy el id: ".$row[IDOPERACION];
   }

}
 

Por hdf1986

68 de clabLevel



Genero:Masculino  

Estudiante de día y developer por las noches

mozilla
Citar            
MensajeEscrito el 09 Mar 2010 01:23 am
Prueba con esto:

Código PHP :

$sql = "SELECT O.IDOPERACION AS id FROM Operaciones O, Estados E WHERE O.IDOPERACION=E.IDOPERACION AND E.IDOPERACION=37 AND IDOPERACION<>38";
$query = mysql_query($sql) or die(mysql_error());

while($row=mysql_fetch_array($query)) {
    $row['id'];
}

Por bucle_infinito

Claber

166 de clabLevel

1 tutorial

 

.NET Developer

firefox
Citar            
MensajeEscrito el 09 Mar 2010 01:10 pm
Muchas gracias por sus respuestas, pero en realidad las consultas expuestas no me dan como respuesta lo que nesecito.

Actualmente tengo la siguiente consulta:

Código MySQL :

SELECT OP.NRO,
count (ES.ESTADO) AS NROES
FROM OPERACIONES AS OP
INNER JOIN ESTADOS AS ES 
ON ES.ESTADO IN(37,38) AN OP.IDOPERACION = ES.IDOPERACION 
GROUP BY OP.IDOPERACION
HAVING (NROES = 1)

Pero no me gusta mucho, me gustaria optimizarla. Alguien que se le ocurra de otra manera. O con otras funciones

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

firefox
Citar            
MensajeEscrito el 09 Mar 2010 02:07 pm
No se si te entiendo bien, pero según la distribución de las tablas no creo que tengas que hacer un join para mostrar las operaciones que tengan el estado 37

Código MySQL :

TBL.OPERACIONES
IDOPERACION    NRO   IDCLIENTE
1              5          85 
2              20         157


TBL.ESTADOS
IDOPERACION  ESTADO   OBSERVACIONES
1              37          NULL
2              37          NULL
1              38          NULL


Al observar la tabla estados, se puede notar que la operacion 1 tiene estado 37 y 38 y la 2 estado 37, entonces para obtener solo las operaciones con estado 37 lo que tendrias que hacer seria:

Código MySQL :

select IDOOPERACION
from ESTADOS 
where ESTADO = '37'
order by IDOOPERACION


En este caso, obtendrías como resultado dos valores que serian 1 y 2.

Si no es asi, entonces no te entendí muy bien, te pediría que re formules la pregunta y con mucho gusto te ayudo.

Por Flashacker

Claber

214 de clabLevel



Genero:Masculino  

Manila

chrome
Citar            
MensajeEscrito el 09 Mar 2010 02:26 pm
Lo que necestiso es ver las operaciones que tengan el estado 37, pero no el 38.- Y claro necesito mas datos de la tbl.operaciones.

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

firefox
Citar            
MensajeEscrito el 09 Mar 2010 02:52 pm

york3rs escribió:

Lo que necestiso es ver las operaciones que tengan el estado 37, pero no el 38.- Y claro necesito mas datos de la tbl.operaciones.


Entonces

Código MySQL :

select IDOOPERACION, ESTADO, OBSERVACIONES -- los campos que necesites 
from ESTADOS  
inner join OPERACIONES
where ESTADOS.IDOPERACION = OPERACIONES.IDOOPERACION and OPERACIONES.ESTADO = '37' 

Por Flashacker

Claber

214 de clabLevel



Genero:Masculino  

Manila

chrome
Citar            
MensajeEscrito el 09 Mar 2010 03:11 pm
La sintaxis es "tbl1 inner join tbl2 ON tbl1=tbl2 "

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

firefox
Citar            
MensajeEscrito el 09 Mar 2010 03:38 pm
Jajaja, me equivoque, prueba asi

Código MySQL :

select * -- los campos que necesites
from a inner b
on a.IDOPERACION = b.IDOPERACION
where b.ESTADO = '37'


En donde a. = TABLA OPERACIONES y b. = TABLA ESTADO

Por Flashacker

Claber

214 de clabLevel



Genero:Masculino  

Manila

chrome
Citar            
MensajeEscrito el 09 Mar 2010 04:17 pm
Dos opciones, escoge la que más te guste...

Código MySQL :

SELECT * FROM TBL.OPERACIONES AS O
LEFT JOIN (SELECT * FROM TBL.ESTADOS WHERE ESTADO = 38) as EC ON EC.IDOPERACION = O.IDOPERACION
INNER JOIN TBL.ESTADOS AS E ON E.IDOPREACION = O.IDOPERACION
WHERE EC.ESTADO IS NULL AND E.ESTADO = 37;


Código MySQL :

SELECT * FROM TBL.OPERACIONES AS O
INNER JOIN TBL.ESTADOS USING (IDOPERACION)
WHERE ESTADO = 37 AND IDOPERACION NOT IN ( SELECT IDOPERACION FROM TBL.ESTADO WHERE ESTADO = 38 )



saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 09 Mar 2010 06:59 pm
Gracias Maikel las dos funcionan perfectamente, estan muy buenas, pero no queria usar consultas anidadas en esta. Que opinas de la consulta que estoy utilizando actualmente:

Código MySQL :

SELECT OP.NRO, 
count (ES.ESTADO) AS NROES 
FROM OPERACIONES AS OP 
INNER JOIN ESTADOS AS ES  
ON ES.ESTADO IN(37,38) AN OP.IDOPERACION = ES.IDOPERACION  
GROUP BY OP.IDOPERACION 
HAVING (NROES = 1) 


Por que al parecer me voy a tener que quedar con ella no mas, tambien llevo horas pensando otra manera, y no encuentro. jjajaj. Bueno por algo sera... (Estoy como jugador de ajedres :P)

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

firefox
Citar            
MensajeEscrito el 09 Mar 2010 07:46 pm
En tu consulta, no estas discriminando a un estado especifico sino a cualquiera de los estados.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 09 Mar 2010 08:08 pm
Se me olvido que siempre los estados llevan un orden, una operacion no puede tener el estado 38 sin haber estado en el estado 37. Pero si no fuera asi, se solucionaria agregando "AND ESTADO = 37"

Código MySQL :

SELECT OP.NRO,  
count (ES.ESTADO) AS NROES ,
ES.ESTADO
FROM OPERACIONES AS OP  
INNER JOIN ESTADOS AS ES   
ON ES.ESTADO IN(37,38) AN OP.IDOPERACION = ES.IDOPERACION   
GROUP BY OP.IDOPERACION  
HAVING (NROES = 1) AND ESTADO = 37

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.