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

Duda sobre si se puede realizar esta consulta

Estas en el tema de Duda sobre si se puede realizar esta consulta en el foro de Mysql en Foros del Web. Id | Padre 1 | 0 2 | 0 3 | 0 4 | 2 5 | 4 6 | 3 Se trata de un ...
  #1 (permalink)  
Antiguo 26/08/2012, 05:11
 
Fecha de Ingreso: julio-2010
Mensajes: 56
Antigüedad: 13 años, 9 meses
Puntos: 3
Pregunta Duda sobre si se puede realizar esta consulta

Id | Padre
1 | 0
2 | 0
3 | 0
4 | 2
5 | 4
6 | 3

Se trata de un sistema de mensajes y sus respuestas.
Padre es el Id del mensaje al que se responde.
Los Id con Padre 0 son mensajes nuevos
Los Id con Padre X son respuestas a algún mensaje anterior.

La consulta que quiero hacer es:
Mostrar aquellos mensajes que aun no hayan sido respondidos, es decir:
Id's cuyo Padre sea = 0 y que no tenga otros Id's cuyo Padre sea igual al Id seleccionado.
  #2 (permalink)  
Antiguo 26/08/2012, 05:31
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: Duda sobre si se puede realizar esta consulta

¿Y cuáles son las tablas que se usan en este caso?
Lo que preguntas puede tener varias soluciones, como por ejemplo:
Si usas una tabla Usuario y otra Mensaje puede ser tan básico como un LEFT JOIN:
Código MySQL:
Ver original
  1. SELECT U.idusuario id, COUNT(M.idmensaje) padre
  2. FROM usuario U LEFT JOIN mensaje M ON U.idusuario = M.idusuario_destino
  3. WHERE M.idusuario_destino IS NULL;

De todos modos esto es imaginario, la sintaxis puede tener enormes variaciones según cuál sea la estructura de tu base... información que siempre pedimos porque no podemos adivinar cómo la has diseñado.
__________________
¿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 26/08/2012, 05:38
 
Fecha de Ingreso: julio-2010
Mensajes: 56
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Duda sobre si se puede realizar esta consulta

Quería hacerlo (si se puede) en una sola tabla, hacerlo sobre el ejemplo que he puesto me vale.
En el ejemplo no uso usuarios, digamos que la tabla que he puesto, se llama "mensajes" si quieres se le puede (yo la he omitido) añadir un campo llamado 'mensaje'.

La solución, me tiene quedar aquellos Id's cuyo valor Padre sea cero y que no tenga respuestas, es decir que no haya otros Id's cuyo valor Padre sea un Id con con Padre igual a cero
  #4 (permalink)  
Antiguo 26/08/2012, 07:54
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: Duda sobre si se puede realizar esta consulta

Usar una sola tabla para mensajes y respuestas no es un buen diseño, porque entonces el mensaje de respuestas cero implicaría leer dos veces la misma tabla: Una para determinar los mensajes iniciales y otra para las respuestas...
No parece ser una buena idea.
Es mucho más simple usar dos tablas: Una para threads (mensajes iniciales) y otra para las respuestas a los threads.
El esquema es el mismo de la consulta que ya te ejemplifiqué, cambiando usuarios por MensajesIniciales o EncabezadosThreads, o como quieras llamarlo.
Ten en cuenta que menos tablas no significa mejores bases de datos ni más simples. El fundamento del diseño de bases de datos es algo más complejo que hablar de tablas.
__________________
¿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 26/08/2012, 08:02
 
Fecha de Ingreso: julio-2010
Mensajes: 56
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Duda sobre si se puede realizar esta consulta

Muchas gracias gnzsoloyo voy a tratar de hacerlo como me dices y te cuento si he llegado a buen puerto
  #6 (permalink)  
Antiguo 26/08/2012, 08:03
Avatar de antoniopol  
Fecha de Ingreso: agosto-2012
Ubicación: Valladolid
Mensajes: 114
Antigüedad: 11 años, 8 meses
Puntos: 21
Respuesta: Duda sobre si se puede realizar esta consulta

Yo estoy con gnzsoloyo considero que es importante realizar dos tablas aunque creo que la sentencia quedaría algo así y podría funcionar:
Código PHP:
Ver original
  1. Select id from mensajes
  2. where padre=0 and padre not in (select padre from mensajes where mensajes padre!=0)
__________________
>> Blog de desarrollo web.
>> @antoniopol06 amante de la Web =D
  #7 (permalink)  
Antiguo 26/08/2012, 08:36
 
Fecha de Ingreso: julio-2010
Mensajes: 56
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Duda sobre si se puede realizar esta consulta

La culpa es mía por no explicar bien todo el asunto. Voy a ver si lo consigo:

Se trata de conversaciones de 1 a 1 en las que sólo un usuario puede responder a otro usuario y en los que sólo puede haber una respuesta a cada mensaje que responde cada usuario.

Ejemplo:

usuario 1 > id1 >"hola" (mensaje primero)
usuario 2 > id2 > "que tal?" (en respuesta a mensaje Id1 de usuario 1)
usuario 1 > id3 > "pues bien" (en respuesta a mensaje Id2 de usuario 2)
usuario 2 > id4 > "pues vale" (en respuesta a mensaje Id3 de usuario 1)
usuario 2 > id 5 > "¿hay alguien?" (este podría ser un nuevo mensaje sin respuestas aun)

Sería una estructura de árbol de orden 1.
Tengo que poder:
- mostrar conversaciones sin respuestas.
- mostrar conversaciones completas.

Última edición por webburgos; 26/08/2012 a las 08:45

Etiquetas: nodos, arboles
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 11:42.