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

Poner un If en una sentencia SQL

Estas en el tema de Poner un If en una sentencia SQL en el foro de Mysql en Foros del Web. Hola buenos dias. Quisiera que me ayudaran con una sentencia, tengo la siguiente tabla PUBLICACIONES -------------------- id_publicacion publicacion flag id_user_origen id_user_destinatario Esuna aplicacion de publicaciones, ...
  #1 (permalink)  
Antiguo 24/01/2015, 13:26
 
Fecha de Ingreso: diciembre-2013
Mensajes: 46
Antigüedad: 10 años, 4 meses
Puntos: 0
Poner un If en una sentencia SQL

Hola buenos dias.
Quisiera que me ayudaran con una sentencia, tengo la siguiente tabla

PUBLICACIONES
--------------------
id_publicacion
publicacion
flag
id_user_origen
id_user_destinatario


Esuna aplicacion de publicaciones, donde se puede publicar a otros usuarios, y ademas al momento de publicar hay una opcion si lo quieres poner privado (para eso esta el flag) que solo lo vea el usuario origen y usuario destinatario, pero no se como hacer esa sentencia.

Por ejemplo, si estoy en el perfil de "Juan"

Programo que me arrogue todas las publicaciones que han sido destinadas a $id_usuario_perfil que es igual a Juan lo saco por GET

Código SQL:
Ver original
  1. SELECT * FROM publicaciones
  2. WHERE id_user_destinatario= '$id_usuario_perfil'
Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.

Lo que quiero validar es que si estoy como session de "Alfredo" y entro al perfil de "Juan" me arrogue todas las publicaciones de "Juan" pero si tiene FLAG valor 1 ( Flag: 0 es publico y 1 es privado) entonces no me lo arrogue porque es privado, a menos que yo "alfredo" se lo haya publicado.

Como se haria esa sentencia? Gracias por leer y por cualquier ayuda. Saludos.

Última edición por gnzsoloyo; 24/01/2015 a las 13:34
  #2 (permalink)  
Antiguo 24/01/2015, 13:45
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, 5 meses
Puntos: 2658
Respuesta: Poner un If en una sentencia SQL

Por empezar, no existe la idea de "poner IF en una sentencia". Para condicionar por verdadero/falso a fin de restringir los resultados que deben o no mostrarse en una consulta existe el WHERE. Lo que debes hacer es poner el ese WHERE las condiciones que deben cumplirse. Todas.
Así de simple.
Ahora bien:
Cita:
Lo que quiero validar es que si estoy como session de "Alfredo" y entro al perfil de "Juan" me arrogue todas las publicaciones de "Juan" pero si tiene FLAG valor 1 ( Flag: 0 es publico y 1 es privado) entonces no me lo arrogue porque es privado, a menos que yo "alfredo" se lo haya publicado.
Eso es algo que me parece que no se puede resolver sólo con una consulta...
Empecemos por el lado de que si entras a un perfil en una web, MySQL no se entera jamás, porque no interactúa con el navegador, ni tampoco sabe de sesiones en las paginas. En todo caso debes pasarle en la consulta SQL (y solo en la consulta funciona), los parámetros que la aplicación tenga y que existan en la base de datos, que le permitan realizar el filtrado del WHERE.
Claro que para eso también es necesario que la estructura de datos pueda hacer las distinciones que planteas.

¿Puede hacerlas?

No lo sabemos, porque no conocemos qué tan hiciste esa estructura de datos.

Tiene que haber al menos una forma de saber que una publicación se haya hecho en un perfil de A, y que tal publicación le pertenece a B, tal que pueda verla.
Esta idea describe al menos dos tablas: La de perfiles y la de publicaciones, y además que ambos datos deben estar en la publicación, y ser públicos.


En principio, la query sobre publicaciones sería mas o menos así:
Código SQL:
Ver original
  1. SELECT *
  2. FROM publicaciones
  3. WHERE id_user = 'Autor'
  4.     AND id_user_destinatario= 'destinatario'
  5.     AND flag = 0;
Pero estoy suponiendo que FLAG es de esa tabla, y que existe un id_user del autor.
Además esto no cubre la posibilidad de que el destinatario responda el mensaje... Para ello debería hacer una relación 1:N entre el mensaje origen y el mensaje respuesta, que no se si has considerado. Ten ne cuenta que una respuesta a ese menaje, sin relacionarlo con ese mensaje, tendría una propiedad de "Privado", con lo que B no podría leerlo...
__________________
¿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 24/01/2015, 14:06
 
Fecha de Ingreso: diciembre-2013
Mensajes: 46
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Poner un If en una sentencia SQL

Hola gnzsoloyo gracias por tu respuesta.
Tengo una tabla de PERFILES donde estan los datos de los usuarios, y manejo sessiones, en la tabla PUBLICACIONES se mira quien hizo la publicacion origen y la publicacion destino.
Tengo que hacer la sentencia en SQL porque manejo paginacion, si valido eso en PHP despues de la Sentencia entonces no me servira la paginacion(por el numero total de arrojadas, puede que no me arrogue ningun registro porque todas sean privadas al momento de darle click a "ver mas").

En esta sentencia me arrogaria todas las publicaciones de el usuario del perfil, menos las privadas, y faltaria que si la SESSION de ese momento sea igual a id_user_origen o id_user_destinatario entonces que si me muestra la publicacion aunque sea Flag 0.
Código SQL:
Ver original
  1. SELECT * FROM publicaciones
  2. WHERE id_user_destinatario= '$id_usuario_perfil' AND flag=0;
  #4 (permalink)  
Antiguo 24/01/2015, 15:19
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, 5 meses
Puntos: 2658
Respuesta: Poner un If en una sentencia SQL

No puedo incorporar la sesión si no se como se relaciona con las publicaciones. Y de lo que comentas no se infiere.
A menos que expliques eso, tendrás que resolverlo tu 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)
  #5 (permalink)  
Antiguo 24/01/2015, 15:38
 
Fecha de Ingreso: diciembre-2013
Mensajes: 46
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Poner un If en una sentencia SQL

para la aplicación que quiero hacer se ocupa 2 tablas:

USUARIOS
----------
id_usuario
nombre
usuario
contraseña

PUBLICACIONES
--------------------
id_publicacion
publicacion
flag
id_user_origen
id_user_destinatario



El usuario inicia sesion con usuario y contraseña. Cada usuario tiene un perfil donde se le puede comentar, pero tiene opcion(checkbox) para hacerlo publicacion privada y que solo el(origen) y el usuario del perfil(destinatario) lo pueda leer. Para es el campo flag.
Lo que nose es hacer la sentencia que me valide eso, que me arroge todas las publicaciones del usuario del perfil (el usuario lo saco con GET url). Y que me arroge solo los publicos(flag=0), pero en caso que sea privado(flag=1) y la session de ese momento es igual a id_user_origen o es igual a id_user_destinatario cual sea de las dos entonces que tambien me lo arroge aunque sea privado, porque es el que creo la publicacion y al que se lo envio tambien lo tiene que mirar.

edite: al momento de yo publicar en el perfil de otro usuario se inserta en la tabla publicaciones lo que escribio(publicacion) quien lo envio que es la session del usuario (id_user_origen) y a quien va dirigido que es el usuario del perfil, que lo saco por el GET url (id_user_destinatario)

Gracias por leer :)

Última edición por redforman; 24/01/2015 a las 15:43
  #6 (permalink)  
Antiguo 24/01/2015, 16:35
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, 5 meses
Puntos: 2658
Respuesta: Poner un If en una sentencia SQL

Bueno, vamos a aclarar previamente un par de conceptos: Un id_usuairo no es una sesión, y una sesión de usuario no está definido por si id_usuarios... Son cosas diferentes.
El id_usuario (que en tu caso es redundante), es el identificador de la tabla de usuarios que permite establecer las relaciones entre la entidad Usuario y los datos persistentes que la base tenga en diferentes tablas. Pero como ID del usuario no identifica en si las acciones realizadas en un mismo período de logueo / deslogueo.
Una sesión y su ID es el el conjunto de interacciones de un usuario en un mismo sistema, desde el momento de su identificación y hasta la terminación de la conexión, que puedan ser consideradas como temporalmente continuas. En ese sentido, las acciones de un usuario en una sesión pueden requerir que se identifique la sesión en la que se realizaron, para lo cual se necesitan obligatoriamente dos datos: 1) un identificador único de sesión, y 2) la fehca y hora en que la accion se produjo.

Nada de esto puede ser soportado por tu modelo de datos. Lde faltan estructuras y atributos para eso.

En segundo lugar, vamos a hacer otra aclaración, para que no volvamos a hablar de este punto: El que los datos en la aplicación lleguen por POST o por GET es totalmente irrelevante para la base de datos. No importa, porque la base jamás ve el origen de los datos en la web; la base sólo se comunica con el servidor, respondiendo peticiones a un puerto determinado, que peuden ser enviadas por una aplicación en PHP, Java, .Net, o lo que fuese, y MySQL no lo sabe ni le interesa saberlo. No agrega ni pone nada, y aclarar el origen de los datos es ajenos al SQL. Sólo tiene utilidad para el programador que crea la aplicación, pero no para el MySQL.

¿Se entiende?

Si hay problemas de programación causados por el origen de los datos en web, es tema de otros foros. Acá solo miraremos lo que tenga que ver con estructura de datos y consultas SQL.
Todo lo que tenga que ver con checkboxes, enlaces, sesiones de PHP y demás, que no sean datos puros que lleguen a la base para registrarse en tablas, para l abase simplemente no existen.

¿Se entiende?

Ahora bien, de acuerdo a esto:

Cita:
que me arroge todas las publicaciones del usuario del perfil (el usuario lo saco con GET url). Y que me arroge solo los publicos(flag=0), pero en caso que sea privado(flag=1) y la session de ese momento es igual a id_user_origen o es igual a id_user_destinatario cual sea de las dos entonces que tambien me lo arroge aunque sea privado, porque es el que creo la publicacion y al que se lo envio tambien lo tiene que mirar.
hay más condiciones a cumplir que las que dijiste al principio:
Cita:
Y que me arroge solo los publicos(flag=0), pero en caso que sea privado(flag=1) y la session de ese momento es igual a id_user_origen
Código MySQL:
Ver original
  1. WHERE (id_user_origen = 'usuariologueado' AND flag = 0)

Cita:
o es igual a id_user_destinatario cual sea de las dos entonces que tambien me lo arroge aunque sea privado
Código MySQL:
Ver original
  1. OR id_user_destinatario= 'destinatario';

Lo que nos acercaría a esto:
Código MySQL:
Ver original
  1. FROM publicaciones
  2. WHERE (id_user_origen = 'usuariologueado' AND flag = 0)
  3.         OR id_user_destinatario= 'usuarilogueado';

Lo que debe quedarte claro es que para poder ver como poner las condiciones debes analizar cuidadosamente para expresarlas como condiciones a cumplir que puedas diferenciar.

Te aclaro que dominar la logica del WHERE lleva algo de tiempo y bastante práctica. No es raro que los expertos también cometan errores.

te sugiero que reveas tu modelo porque como ya te dije, no soporta en realidad diferenciar las acciones de los usuarios por sesiones, ya que las sesiones no están ni identificadas, ni temporalizadas.
__________________
¿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 24/01/2015, 17:21
 
Fecha de Ingreso: diciembre-2013
Mensajes: 46
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Poner un If en una sentencia SQL

Gracias por tu tiempo gnzsoloyo
Ya encontra la solucion:

Código SQL:
Ver original
  1. SELECT * FROM publicaciones WHERE (id_usuario_dest='$id_usuario_perfil' AND flag=0)  OR
  2.        (id_usuario_dest='$id_usuario_externo' AND flag=1  AND '$id_usuariologeado' IN (id_user_dest, id_user_origen))

En esta sentencia lo que hace es: te arrojo todas las publicaciones que van destinadas al perfil en el que estas y que sean publicas, O tambien te arrojo las publicaciones del perfil y si son privadas y tiene que ver el usuario logeado con el origen o destinatario, entonces tambien arrojamelas.

Gracias por todo :)

Etiquetas: select, sentencia, sql, tabla
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 10:05.