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

Consultas condicionadas

Estas en el tema de Consultas condicionadas en el foro de Mysql en Foros del Web. Hola, Tengo un problema al recuperar los "posts" que tengo en la base de datos. Me explico: Los campos de la tabla "posts" son: id, ...
  #1 (permalink)  
Antiguo 07/03/2013, 17:57
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 8 años
Puntos: 2
Consultas condicionadas

Hola,

Tengo un problema al recuperar los "posts" que tengo en la base de datos. Me explico:

Los campos de la tabla "posts" son: id, autor, contenido, [...].
Los campos de la tabla "usuarios" son: id, nombre, [...].
Donde, si posts.autor es un número, posts.autor = usuarios.id; si no es un número, es el nombre de un usuario no registrado.

Código SQL:
Ver original
  1. SELECT posts.id, usuarios.nombre AS autor, FROM posts, usuarios WHERE posts.autor = usuarios.id ORDER BY fecha_pub

El problema al añadir la posibilidad de que no registrados escriban posts, el campo autor puede tener directamente el nombre del autor no registrado, pero como sigue buscando el usuario cuyo id es un string, no lo va a encontrar.
Resultado: no muestra los posts de usuarios no registrados.

Sabe alguien cómo debe ser la consulta para recuperar bien estos campos?
  • posts.id
  • si posts.autor regexp '^[0-9]+$' (es un número) entonces usuarios.nombre as autor; si no, posts.autor
  • [...]
  • si autor regexp '^[0-9]+$' entonces WHERE posts.autor = usuarios.id; si no, no existe esta condición

Resumen: si posts.autor es un número, ir a buscar su nombre en la tabla usuarios; si no, posts.autor ya es el nombre.

Muchas gracias
  #2 (permalink)  
Antiguo 07/03/2013, 19:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 11 años, 8 meses
Puntos: 2653
Respuesta: Consultas condicionadas

Lo que estás planteando está mal desde los fundamentos: Un atributo de una entidad no puede tener dos dominios (campo de existencia) diferentes. Eso es básico.
Si quieres que un usuario no registrado ponga posts, entonces debes modificar tu modelo de datos para contemplar esa posibilidad, pero no puedes retorcer la relación para que acepte valores imposibles.
__________________
¿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 08/03/2013, 03:06
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 8 años
Puntos: 2
Respuesta: Consultas condicionadas

¿Entonces que propones? Ahora el campo autor es un varchar.

¿Tener autor (NULL) como integer y otro campo mas llamado nombre_autor_no_registrado (NULL) como varchar?

¿otra idea mejor?

Gracias
  #4 (permalink)  
Antiguo 08/03/2013, 03:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 11 años, 8 meses
Puntos: 2653
Respuesta: Consultas condicionadas



¿Qué tanto sabes del modelo E-R? Es decir de las bases de datos relacionales.
Para tu esquema, hay más de una solución posible.
Puedes plantear u campo adicional que guarde el kick (supongamos), que sea unique, y que sea obligatorio al registrarse, o lo uses como clave alternativa, cuando no está registrado. En las consultas que devuelven un username NULL para esos casos, simplemente usas ese valor para mostrar el autor.
Otra posibliliad es expandir el esquema de tablas agregando tablas específicas para los posts de visitas.
Y estos son sólo dos opciones...

Te recuerdo que ya existen en la web infinidad de paginas que tienen el comportamiento que buscas. No trates de inventar la rueda otra vez. Fijate cómo lo hacen.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: autor, condicionada, post, registrado
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 16:18.