Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Como usar 2 select if juntos

Estas en el tema de Como usar 2 select if juntos en el foro de Mysql en Foros del Web. Saludos tengo este problema con los if cuando solo utilizo uno funciona: Código: SELECT (SELECT IF(id=1,'si','no')) AS var FROM tabla Y mi imprime todo var ...
  #1 (permalink)  
Antiguo 13/05/2012, 01:41
 
Fecha de Ingreso: julio-2010
Mensajes: 158
Antigüedad: 13 años, 9 meses
Puntos: 3
Como usar 2 select if juntos

Saludos tengo este problema con los if cuando solo utilizo uno funciona:

Código:
SELECT (SELECT IF(id=1,'si','no')) AS var  FROM tabla
Y mi imprime todo var ya sea con si o con no, pero si uso otro if :

Código:
SELECT (SELECT IF(id=1,'si','no')) AS var (SELECT IF(op=1,'si','no')) AS foo  FROM tabla
Me marca error, como puedo usar estas 2 condiciones en una consulta?
  #2 (permalink)  
Antiguo 13/05/2012, 08:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como usar 2 select if juntos

Te falta una coma (además de hacer susbselects innecesarios):
Código MySQL:
Ver original
  1.     IF(id=1,'si','no') var, -- -< Aca te faltaba una coma.
  2.     IF(op=1,'si','no') foo  
  3. FROM tabla
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 13/05/2012, 13:23
 
Fecha de Ingreso: julio-2010
Mensajes: 158
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Como usar 2 select if juntos

Muchas gracias por responder, pero si quisiera relacionarlas de esta forma:

Código:
SELECT 

    IF(id=1,'si','no') var, 
    IF(var='si','hola','adios') foo  

FROM tabla
Me marca error, es posible hacer esta relacion? O estoy poniendolo de mal forma?
  #4 (permalink)  
Antiguo 13/05/2012, 15:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como usar 2 select if juntos

No puedes usar el alias que pones en el SELECT ni dentro del mismo SELECT, ni dentro del WHERE. Es una restricción general de todos los sistemas de bases de datos.
Para hacer lo que quieres, tienes que anidar nuevamente la misma función:
Código MySQL:
Ver original
  1.     IF(id=1,'si','no') var,
  2.     IF(IF(id=1,'si','no')='si','hola','adios') foo  
  3. FROM tabla
Ahora bien, si te fijas, es lo mismo que escribir:
Código MySQL:
Ver original
  1.     IF(id=1,'si','no') var,
  2.     IF(id=1,'hola','adios') foo  
  3. FROM tabla
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 13/05/2012, 15:34
 
Fecha de Ingreso: julio-2010
Mensajes: 158
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Como usar 2 select if juntos

Lo pude hacer usando el @ de esta forma:

Código PHP:
SELECT 

@var:=IF(id=1,'si','no') var, 
IF(@var=
'si','hola','adios'foo  

FROM tabla 
Pero si luego quiero usar el foo en el where, no me marca error pero no me muestra resultados:

Código PHP:
SELECT 

@var:=IF(id=1,'si','no') var, 
@
foo:=IF(@var='si','hola','adios'foo  

FROM tabla

WHERE 
@foo!='adios' 
Sabes como podria funcionar? Ya es lo ultimo que me falta, y muchas gracias por tomarte el tiempo y responder =)
  #6 (permalink)  
Antiguo 13/05/2012, 15:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como usar 2 select if juntos

Si en la tabla existe un id = 1, esa consulta jamás devolverá datos, a causa de que en el momento en que se evalua el WHERE, @foo es NULL.
Como la asignación es dinámica, el valor de las variables del SELECT sólo se asigna sobre los datos resultado. Pero como para el momento evaluar el WHERE, aún no se le asignó valor alguno a @foo, la consulta no devuelve dato alguno (no, NULL no es un dato, es un estado).

Es tan evidente esto, que si le asignas un valor de espacio vacío a @foo antes de la operación, esta si da resultados:
Código MySQL:
Ver original
  1. mysql> set @foo := '';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT
  5.     ->
  6.     -> @var:=IF(1=1,'si','no') var,
  7.     -> @foo:=IF(@var='si','hola','adios') foo
  8.     -> from dual
  9.     -> WHERE @foo != 'hola';
  10. +-----+------+
  11. | var | foo  |
  12. +-----+------+
  13. | si  | hola |
  14. +-----+------+
  15. 1 row in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 13/05/2012, 15:51
 
Fecha de Ingreso: julio-2010
Mensajes: 158
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Como usar 2 select if juntos

Entonces no se puede lo que estoy haciendo? Intente de esta forma pero tampoco funciona:

Código PHP:
SELECT  

@var:=IF(id=1,'si','no') var,    

FROM tabla 

WHERE 
(IF(@var='si','hola','adios')) !='adios' 
Alguna idea? Gracias por la ayuda.
  #8 (permalink)  
Antiguo 13/05/2012, 16:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como usar 2 select if juntos

Vamos de nuevo:
Cuando la consulta se ejecuta, el WHERE de tu consulta se ejecuta antes de la asignación de valores a las variables en el SELECT, por lo que para ese momento, las variables valen NULL, y como NULL no es un dato, sino un estado de indefinición, los operadores lógicos no pueden devolver un TRUE o FALSE. Devuelven NULL.
Entonces, en esas condiciones, y sin inicialización previa, la consulta no devuelve datos.

¿Se entiende ahora mejor?

No puedes obtener datos en esas condiciones, porque el valor de la variable al momento de evaluarla en el WHERE es NULL. Y por definición, toda oepración matemática, aritmetica, lógica o comparativa con NULL devuelve NULL.
Y un registro NULL es una tabla sin registros

Cita:
Alguna idea? Gracias por la ayuda.
Para empezar deberías explicarnos qué es lo que se supone que estás queriendo lograr, porque no se entiende el sentido de esa consulta.
¿Que se supone que tienes y qué deseas obtener?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 13/05/2012, 17:07
 
Fecha de Ingreso: julio-2010
Mensajes: 158
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Como usar 2 select if juntos

No crei que se me complicara tanto, por eso no en si lo que necesito pero es esto.

Tengo este sistema de mensajes y necesito mostrar los mensajes que no han sido eliminados es decir que sean diferentes de "eli"

Código PHP:
+--------+------------+------------+------------+------------+
id     yo         el         |estadoyo    |  estadoel  |
+--------+------------+------------+------------+------------+
1      1          |         3  si         |         si 
2      4          |         1  no         |         no 
3      1          |         2  eli        |         no 
4      5          |         1  si         |        eli |
5      1          |         6  no         |          si
+--------+------------+------------+------------+------------+ 
Primero comparo quien soy, suponiendo que $session es igual a 1

//Si la tabla yo es igual a 1 vale el texto YO sino vale EL
@soy:=IF(yo=$session,'YO','EL')

//Si soy vale YO vale el valor del estadoyo sino vale estadoel
@estado:=IF(@soy='YO',estadoyo,'estadoel')

//Si el estado es diferente de eli se muestra sino no porque esta eliminado
WHERE @estado!='eli'
  #10 (permalink)  
Antiguo 13/05/2012, 19:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como usar 2 select if juntos

Cita:
Tengo este sistema de mensajes y necesito mostrar los mensajes que no han sido eliminados es decir que sean diferentes de "eli"
Por un lado, pareces tener un sistema de mensajes algo complicado, o al menos no muy estándar. Es posible que lo hayas construido sobre la marcha, sin buscar si existen modelos de ejemplo que pudieses adaptar o usar.
Consejo: No trates de inventar la rueda. Ya hay muchos sistemas de ese uso que puedes encontrar en librerías de diseños de bases de datos. Úsalos.

Por otro lado, no entiendo muy bien por qué te metes a manejar variables de usuario en MySQL.
Ese tipo de variables son extremadamente potentes, pero no son sencillas de usar. Hay que estar habituado para dominarlas, y aún así se mete la pata con ellas.
Pero por sobre todo, no entiendo para qué usar ese tipo de variables, en un caso donde no parecen ser necesarias porque todos los parámetros ya los tienes antes de la consulta.



Veamos... Para lograr esto:
Cita:
...necesito mostrar los mensajes que no han sido eliminados es decir que sean diferentes de "eli"
Para descartar todos los eliminados, la consulta es tan sencilla como:
SELECT id, yo, el, estadoyo, estadoel
FROM tabla
WHERE estadoyo = 'eli' OR estadoel != 'eli';

Ahora bien, esto no se entiende ni medio:
Cita:
//Si la tabla yo es igual a 1 vale el texto YO sino vale EL
@soy:=IF(yo=$session,'YO','EL')

//Si soy vale YO vale el valor del estadoyo sino vale estadoel
@estado:=IF(@soy='YO',estadoyo,'estadoel')
Pero si lo que quieres decir es que si la primera columna es 1, ponga el valor de la tercera y si no el de la cuarta, eso es tan simple como:

Código MySQL:
Ver original
  1. SELECT IF(yo=1, estadoyo, estadoel) estados
  2. FROM tabla
  3. WHERE estadoyo = 'eli' OR estadoel != 'eli';

Porque si el uso del primer cálculo es sólo para determinar cuál de los otros valores pones, ese calculo se vuelve innecesario.

¿Podrías aclararme si estos son los resultados esperados?

PD: Tengo la impresión de que no tienes una practica extensa en SQL, o bien estás mezclando los métodos de programación con los de BBDD/SQL, que no son lo mismo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 13/05/2012, 20:31
 
Fecha de Ingreso: julio-2010
Mensajes: 158
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Como usar 2 select if juntos

No puedo poner:

WHERE estadoyo = 'eli' OR estadoel != 'eli';

que creo que es esto:

WHERE estadoyo != 'eli' OR estadoel != 'eli';

Porque supon en el id 4 ahi el valor mio que es 1 se encuntra en "el", por lo tanto "estadoel" es quien se debe consultar para saber si esta eliminado o no, pero la condicion de arriba primero va a evaluar "estadoyo" que es diferente de "eli" y por lo tanto mostrara esa fila.

La solucion es saber primero que nada si la sesion del usuario en este caso 1, le pertenece a Yo o a EL.

Para eso hago esto:


Como dije necesito saber quien soy.Comparo la columna yo si vale 1 si es asi @soy es igual a YO, sino es EL
@soy:=IF(yo=$session,'YO','EL')

Despues de saber quien soy, necesito saber el estado si se esta eliminado o no.
@estado:=IF(@soy='YO',estadoyo,'estadoel')

Y ya de ahi con el WHERE muestros los que no se han eliminado que es lo que no me sale. Los resultados de los 5 casos que puse arriba serian:

1 - soy = yo / estado = si / se muestra
2 - soy = el / estado = no / se muestra
3 - soy = yo / estado = eli / no se muestra
4 - soy = el / estado = eli / no se muestra
5 - soy = yo / estado = no / se muesta

Espero haberme explicado, y agradesco tu ayuda. Saludos.
  #12 (permalink)  
Antiguo 13/05/2012, 21:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como usar 2 select if juntos

No me has contestado la pregunta:
¿Por qué estás usando variables de usuario para esto, y no armas las consultas en base a los parámetros que tienes?
¿Por qué tan complicado?
Asi como lo planteas, me resulta un poco difícil de comprender porque no sé qué es "el", "yo", "estadoyo" y "estadoel".
Si al menos pudieras describir el sistema con un lenguaje más cercano a la realidad o al diseño de datos, tal vez sería más sencillo.

Es más, empecemos razonando como desabolladores de Base de Datos: ¿Qué condiciones tiene que cumplir un registro para ser devuelto?
Y por condiciones, me refiero a qué valores reales debe contener en qué campos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 13/05/2012, 21:48
 
Fecha de Ingreso: julio-2010
Mensajes: 158
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Como usar 2 select if juntos

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No me has contestado la pregunta:
¿Por qué estás usando variables de usuario para esto, y no armas las consultas en base a los parámetros que tienes?
¿Por qué tan complicado?
Asi como lo planteas, me resulta un poco difícil de comprender porque no sé qué es "el", "yo", "estadoyo" y "estadoel".
Si al menos pudieras describir el sistema con un lenguaje más cercano a la realidad o al diseño de datos, tal vez sería más sencillo.

Es más, empecemos razonando como desabolladores de Base de Datos: ¿Qué condiciones tiene que cumplir un registro para ser devuelto?
Y por condiciones, me refiero a qué valores reales debe contener en qué campos.
Bueno si en variables de usuario te refieres a las de $_SESSION la cosa esta asi:

Despues de loguerarse el usuario se guarda su id en $_SESSION[id] que la guardo y abrevio en $sesion, esa id corresponde a la tabla usuarios, no creo que sea necesario ponerla aqui, pues lo unico que saco es el valor de la id, en este caso es la mia y su valor es 1.

Ahora supon que estoy logueado, entonces cuando yo envie un mensaje, en la tabla mensajes se insertan los siguientes datos:

YO -> esta columna es de quien lo envia, y quien lo envia soy yo, que le pertenece la id.

EL -> esta columna es quien lo recibe.

ESTADOYO -> es el estado de quien lo envio, y solo puede tener el valor "eli" de eliminado.

ESTADOEL -> es el estado de quien lo envia, por default tiene el valor "no" que quiere decir que no lo ah leido, cuando el usuario lo lee, cambia su valor a "si", y cuando lo elimina cambia a "eli".

Pues no se que mas explicar, y talvez lo veas complicado, pero segun yo es lo mas logico, es decir cuando se envia un mensaje tiene que existir la id de quien lo envio y quien lo recibio, y tiene que existir 2 estados, o al menos eso creo.
Espero tus respuestas y gracias por tu tiempo.
  #14 (permalink)  
Antiguo 14/05/2012, 04:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como usar 2 select if juntos

Cita:
Bueno si en variables de usuario te refieres a las de $_SESSION la cosa esta asi:
No. Las variables de usuario a las que me refiero son las variables que MySQL usa dentro de su código SQL, y que se identifican por un "@".
En tu caso, se trata de "@var" o "@foo".

Todo lo que tenga que ver con PHP o cualquier otro lenguaje es OFF-TOPIC y no se trata en el Foro de Base de Datos (Normas del Foro).

Del resto te comentaré mas tarde, porque ahora tengo que salir a trabajar...

Hasta luego.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 14/05/2012, 13:45
 
Fecha de Ingreso: julio-2010
Mensajes: 158
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Como usar 2 select if juntos

El problema ya lo solucione, bueno siempre lo tuve solucionado, y es filtrar los mensajes con el php:

if(row[leido]!='eli') { resto del codigo... }

Si ya se que me diras porque seguia, y es que las cosas de mysql me gusta hacerlas con mysql sin tocar el php, pero creo que en este caso no se pudo, y las variables no son necesarias, tambien funcionan con los metodos que mencionaste arriba:

Código PHP:
SELECT 

    
IF(id=1,'si','no') var, 

    IF(IF(
id=1,'si','no')='si','hola','adios'foo  

FROM tabla 

Código PHP:
SELECT 

    
IF(id=1,'si','no') var, 

    IF(
id=1,'hola','adios'foo  

FROM tabla 
Aun asi gracias, pero si se te ocurre solocuinarlo solo con mysql, te lo agradeceria mucho que lo compartas

Etiquetas: juntos, select, tabla, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:02.