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

Relacionar 2 tablas

Estas en el tema de Relacionar 2 tablas en el foro de Mysql en Foros del Web. Hola, Nesesito relacionar 2 tablas (para ahorrar tiempo de consultas ). Tengo estas 2 tablas: users - id - nick .. temas -id -autor <-- ...

  #1 (permalink)  
Antiguo 21/12/2009, 07:57
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Relacionar 2 tablas

Hola,
Nesesito relacionar 2 tablas (para ahorrar tiempo de consultas ). Tengo estas 2 tablas:

users
- id
- nick
..
temas
-id
-autor <-- id user
-ultimo_autor <-- id user (no es la misma que arriba)
..

y en temas tengo guardada la id del usuario (de la tabla users). Lo que ago ahora, es esto:
Código SQL:
Ver original
  1. SELECT tema.id AS id_tema, tema.respuestas AS respuestas, tema.foro AS foro, tema.utlautor AS utlautor, tema.visitas AS visitas, USER.nick AS autor, USER.id AS uid, tema.contenido AS contenido, tema.title AS title, tema.ulttime AS ulttime
  2.           FROM temas AS tema
  3.           LEFT JOIN users AS USER ON tema.autor=USER.id WHERE tema.foro='.intval($_GET['foro']).' AND tema.tema=0 ORDER BY tema.ulttime DESC
y anda bien, pero solo me devuelve el nick del autor (porque no se como hacer para que me devuelva tambien el del ultimo autor).
Gracias
Salu2
__________________
Half Music - www.halfmusic.com
  #2 (permalink)  
Antiguo 21/12/2009, 08:38
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Relacionar 2 tablas

podrías hacer un nuevo left join con la tabla users pero con diferente alias y llamar al ultimo autor en esta tabla.

lo has intentado?

Si sigues con problemas, te recomiendo postees los create table y algunos inserts de prueba de las tablas y la salida que esperarías

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 21/12/2009, 09:27
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

WOW!.. gracias!! no sabia que era tan facil xD
haci me quedo:
Código sql:
Ver original
  1. SELECT tema.id AS id_tema, tema.respuestas AS respuestas, tema.foro AS foro, tema.utlautor AS utlautor, tema.visitas AS visitas, USER.nick AS autor, USER.id AS uid, tema.contenido AS contenido, tema.title AS title, tema.ulttime AS ulttime, u.nick AS ULTIMOO
  2. FROM temas AS tema
  3. LEFT JOIN users AS USER ON tema.autor = USER.id
  4. LEFT JOIN users AS u ON tema.utlautor = u.id
  5. WHERE tema.foro =2
  6. AND tema.tema =0
  7. ORDER BY tema.ulttime DESC

Otra cosa ahora (por no abrir un nuevo tema :p).. tengo esta consulta:
Código SQL:
Ver original
  1. SELECT * FROM foros WHERE tema=".intval($row_foros['id'])." ORDER BY posision DESC
como ago para que me devuelva la cantidad de resultados de otra consulta.. como:
Código SQL:
Ver original
  1. SELECT * FROM temas WHERE tema=0 AND foro=".intval($row_foros['id'])."
(No se si se entiende, es para que me devuelva la cantidad de resultados, todo en 1 consulta xD)
Gracias
Salu2
__________________
Half Music - www.halfmusic.com

Última edición por pato12; 21/12/2009 a las 09:32
  #4 (permalink)  
Antiguo 21/12/2009, 11:46
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Hola,
Intente hacer el sql, pero en phpmyadmin me da este error:
#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
el sql:
Código SQL:
Ver original
  1. SELECT foro.*, COUNT(temas.id) AS temas_c, COUNT(mensajes.id) AS mensajes_c
  2.     FROM foros_table AS foro
  3.         LEFT JOIN temas_table AS temas ON temas.tema=0 AND temas.foro=foro.id
  4.         LEFT JOIN temas_table AS mensajes ON mensajes.foro=foro.id
  5.     WHERE foro.tema=0 ORDER BY foro.posision DESC
Gracias
Salu2
__________________
Half Music - www.halfmusic.com
  #5 (permalink)  
Antiguo 21/12/2009, 11:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Relacionar 2 tablas

cuando utilizas funciones de agrupación como count,max,min,sum debes incluir en la consulta la clausula group by.

No veo que lo utilices en la consulta.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 21/12/2009, 11:55
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

y.. como se la usa? xD
__________________
Half Music - www.halfmusic.com
  #7 (permalink)  
Antiguo 21/12/2009, 12:06
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Relacionar 2 tablas

mira esto
http://dev.mysql.com/doc/refman/5.0/...functions.html

En pocas palabras, cuando muestras uno o mas campos y usas funciones de agrupación, se aplicará para cada registro que agrupe el primer campo.

Código MySQL:
Ver original
  1. mysql> select *from ventas;
  2. +------------+-------+
  3. | fecha      | valor |
  4. +------------+-------+
  5. | 2009-12-21 |  2300 |
  6. | 2009-12-21 |  5600 |
  7. | 2009-12-21 |  8700 |
  8. | 2009-12-21 |  1200 |
  9. | 2009-12-22 |  1200 |
  10. | 2009-12-22 |  6500 |
  11. | 2009-12-22 |  9750 |
  12. +------------+-------+
  13. 7 rows in set (0.00 sec)
  14.  
  15. mysql> select fecha, sum(valor) from ventas group by fecha;
  16. +------------+------------+
  17. | fecha      | sum(valor) |
  18. +------------+------------+
  19. | 2009-12-21 |      17800 |
  20. | 2009-12-22 |      17450 |
  21. +------------+------------+
  22. 2 rows in set (0.00 sec)
  23.  
  24. mysql>

como ves se suman las ventas por día.

si pones a mostrar el campo fecha, el no sabrá con que criterio dar una suma si no hicieses la agrupación por fecha.

se entiende?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 21/12/2009, 12:13
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

No entendi mucho :S.. lo que entiendo es que te agrupa, pero yo no quiero agruparlos. Mira esta es mi tabla:
foros
-id
-nombre
..
temas
-id
-foro <-- es el id del foro
-tema <-- es 0 si no es respuesta
...

y quiero que me devuelva el nombre (y los otros campos) y cuantos temas y respuestas del foro.
__________________
Half Music - www.halfmusic.com
  #9 (permalink)  
Antiguo 21/12/2009, 12:26
 
Fecha de Ingreso: septiembre-2009
Mensajes: 124
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: Relacionar 2 tablas

Buenas!!

Podrias hacer esto, tenes dos opciones:

1) para sacar solo los campos de foros

Código PHP:

SELECT foros
.* FROM foros LEFT JOIN temas ON temas.id foros.id 
2) para sacar todos los campos de las dos tablas

Código PHP:

SELECT foros
.*, temas.* FROM foros LEFT JOIN temas ON temas.id foros.id 

Espero que sirva. No lo probe porque estoy en el trabajo, y estoy apretado. Pero la diea esta por lo menos, jaja.

Saludos!

Última edición por estefanosalazar; 21/12/2009 a las 12:43
  #10 (permalink)  
Antiguo 21/12/2009, 12:33
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Cita:
Iniciado por estefanosalazar Ver Mensaje
Buenas!!

Podrias hacer esto, tenes dos opciones:

1) para sacar solo los campos de foros

[MYSQL]

SELECT foros.* FROM foros LEFT JOIN temas ON temas.id = foros.id

[/MYSQL]

2) para sacar todos los campos de las dos tablas

[MYSQL]

SELECT foros.*, temas.* FROM foros LEFT JOIN temas ON temas.id = foros.id

[/MYSQL]


Espero que sirva. No lo probe porque estoy en el trabajo, y estoy apretado. Pero la diea esta por lo menos, jaja.

Saludos!
Gracias, pero yo no quiero sacar los temas xD.. quiero contar los temas y mensajes :p
__________________
Half Music - www.halfmusic.com
  #11 (permalink)  
Antiguo 21/12/2009, 13:24
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: Relacionar 2 tablas

Cita:
Gracias, pero yo no quiero sacar los temas xD.. quiero contar los temas y mensajes :p
Entonces quieres que aparezca:
- ID del foro
- Nombre del coro
- Cantidad de Temas
- Cantidad de mensajes totales

Eso, Pato12, es agrupamiento de cantidades por foro .
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 21/12/2009, 13:44
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Y como seriea entonces?
Asi no me anda:
Código SQL:
Ver original
  1. SELECT foro.*, COUNT(temas.id) AS temas, COUNT(mensajes.id) AS mensajes
  2.     FROM foros_table AS foro
  3.         LEFT JOIN temas_table AS temas ON temas.tema=0 AND temas.foro=foro.id
  4.         LEFT JOIN temas_table AS mensajes ON mensajes.foro=foro.id
  5.     WHERE foro.tema=0 ORDER BY foro.posision DESC GROUP BY foro.id
Gracias
Salu2
__________________
Half Music - www.halfmusic.com
  #13 (permalink)  
Antiguo 21/12/2009, 13:51
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: Relacionar 2 tablas

Algunas cosas no se comprenden a simple vista, como por ejemplo, que haya un campo temas.tema que valga cero ¿eso qué significa exactamente?

SI las tablas se vinculan por su ID, la cosa tal vez sea:
Código MySQL:
Ver original
  1.    foro.*,
  2.    COUNT(temas.id) temas,
  3.    COUNT(mensajes.id) mensajes
  4.    foros_table foro LEFT JOIN
  5.    temas_table AS temas ON temas.foro=foro.id LEFT JOIN
  6.    temas_table AS mensajes ON mensajes.foro=foro.id
  7. ORDER BY foro.posision DESC
  8. GROUP BY foro.id
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 21/12/2009, 13:59
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Gracias, el valor 0 indica que es un tema, si no es 0 es una respuesta.
Pero no anda bien :S.. me da este error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY foro.id
LIMIT 0, 30' at line 1

pero si borro el ORDER BY foro.posision DESC anda :S.. pero me devuelve mal los datos. Me devuelve en mensajes 210 y en temas 210, pero solo hay 35 mensajes y 5 temas :S.
Salu2
__________________
Half Music - www.halfmusic.com
  #15 (permalink)  
Antiguo 21/12/2009, 14:02
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: Relacionar 2 tablas

Código MySQL:
Ver original
  1.    foro.*,
  2.    COUNT(temas.id) temas,
  3.    COUNT(mensajes.id) mensajes
  4.    foros_table foro LEFT JOIN
  5.    temas_table AS temas ON temas.foro=foro.id LEFT JOIN
  6.    temas_table AS mensajes ON mensajes.foro=foro.id
  7. GROUP BY foro.id) T1
  8. ORDER BY foro.posision DESC ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 21/12/2009, 14:06
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Igual me da error :S
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT foro. * , COUNT( temas.id ) temas , COUNT( mensajes.id ) mensajes FRO' at line 1
__________________
Half Music - www.halfmusic.com
  #17 (permalink)  
Antiguo 21/12/2009, 15:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Relacionar 2 tablas

pato12,

esto de foro.* es sospechoso, pues tratas de mostrar todos los campos de la tabla cuyo alias es foro, es decir, foros_table, además del count. Ahí sólo podrías mostrar el campo por el que agrupas, es decir, foro.id. Prueba esto y nos dices:
Código SQL:
Ver original
  1. SELECT T1.idforo, T1.temas, T1.mensajes FROM (SELECT  foro.id idforo, COUNT(temas.id) temas, COUNT(mensajes.id) mensajes FROM foros_table foro LEFT JOIN temas_table AS temas ON temas.foro=foro.id LEFT JOIN temas_table AS mensajes ON mensajes.foro=foro.id GROUP BY foro.id)T1 ORDER BY t1.temas, T1.mensajes
No entiendo por qué ordenas por un campo llamado posision que no veo por ninguna parte.
  #18 (permalink)  
Antiguo 21/12/2009, 15: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, 4 meses
Puntos: 2658
Respuesta: Relacionar 2 tablas

Las observaciones de jurena son válidas.
Uno de los problemas de poner todos los campos, es saber si realmente necesitas todos esos campos. ASí la consulta es ineficiente.
Además de ello, estás poniendo el mismo nombre alias (mensajes) a una tabla que a una columna del SELECT, lo que puede dar lugar a errores.
Código MySQL:
Ver original
  1. FROM  
  2.     (SELECT
  3.        F.*,
  4.        COUNT(T.id) `Total Temas`,
  5.        COUNT(M.id) `Total Mensajes`
  6.     FROM
  7.          foros_table F
  8.          LEFT JOIN  temas_table T ON T.foro=F.id
  9.          LEFT JOIN  temas_table M ON M.foro=F.id
  10.     GROUP BY F.id) T1
  11. ORDER BY T1.posision DESC ;
Ahora bien, la consulta, tal y cual la pongo, no contiene errores sintácticos, lo que sí me llama la atención es que la misma tabla (temas_table) maneje también la información de los mensajes...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #19 (permalink)  
Antiguo 21/12/2009, 15:36
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Hola,
Ahora me devuelve 1225 en temas y mensajes con tu sql jurena :S y solo hay 35 mensajes y 5 temas :p..
El campo posision, es int que va del 0 al 10 y es para ordenar las posisiones del foro.
Gracias
Salu2

EDITO:
Gnzsoloyo tu sql tambien me devuelve 1225 en mensajes y temas :S
__________________
Half Music - www.halfmusic.com
  #20 (permalink)  
Antiguo 21/12/2009, 15:40
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: Relacionar 2 tablas

Cita:
El campo posision, es int que va del 0 al 10 y es para ordenar las posisiones del foro.
¿Y cómo asignas a ese valor? ¿En qué momento?
Por otro lado, si estás poniendo esa condición, el ORDER BY es superfluo, a menos que haya más de un registro con cero en ese campo, ya que sólo devolvería aquellos que tengan ese valor... y en ese caso el ordenamiento debería ser por otra columna.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #21 (permalink)  
Antiguo 21/12/2009, 15:43
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Es que mira, el campo posision es asignado desde un panel y en la tabla foro estan las categorias, foros y subforos :p
__________________
Half Music - www.halfmusic.com
  #22 (permalink)  
Antiguo 21/12/2009, 16:07
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: Relacionar 2 tablas

Sería buena idea, entonces que nos postearas las estructuras de las tablas, porque las relaciones en las consultas parecen estar mal planteadas, y eso puede ser poque se están usando incorrectamente las FK.
Por cierto, es evidente que se está produciendo algún producto cartesiano (posiblemente por una error de claves), porque precisamente en el caso que le dices a jurena 35 x 53 = 1225, ergo, es un producto cartesiano...

Postea las sentencias de CREATE TABLE de las tablas involucradas para comprender mejor la estructura.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #23 (permalink)  
Antiguo 21/12/2009, 16:20
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

No entendi lo que es producto cartesiano xD
Esta son las tablas (estoy haciendo un foro, tipo phpbb):
Código SQL:
Ver original
  1. CREATE TABLE `half_foros` (
  2.   `id` INT(100) NOT NULL AUTO_INCREMENT,
  3.   `tema` INT(100) NOT NULL,
  4.   `name` VARCHAR(255) NOT NULL,
  5.   `detalle` VARCHAR(255) NOT NULL,
  6.   `posision` INT(10) NOT NULL,
  7.   `privado` INT(100) NOT NULL,
  8.   PRIMARY KEY  (`id`)
  9. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  10.  
  11. CREATE TABLE `half_temas` (
  12.   `id` INT(100) NOT NULL AUTO_INCREMENT,
  13.   `title` VARCHAR(255) NOT NULL,
  14.   `autor` INT(100) NOT NULL,
  15.   `respuestas` INT(25) NOT NULL,
  16.   `visitas` INT(25) NOT NULL,
  17.   `utlautor` INT(100) NOT NULL,
  18.   `ulttime` INT(100) NOT NULL,
  19.   `foro` INT(10) NOT NULL,
  20.   `tema` INT(100) NOT NULL,
  21.   `contenido` text NOT NULL,
  22.   `time` INT(100) NOT NULL,
  23.   PRIMARY KEY  (`id`)
  24. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
__________________
Half Music - www.halfmusic.com
  #24 (permalink)  
Antiguo 22/12/2009, 04:41
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Relacionar 2 tablas

pato12,
no entiendo bien cómo estableces las relaciones. En realidad, no entiendo si en la primera tabla guardas foros o temas. Si guardas foros y en name pones el nombre del foro, no sé por qué tienes un campo llamado tema de tipo numérico en esa tabla. Los temas pertenecen a los foros y sólo deberían estar en la tabla half_temas. Por otra parte, en la tabla half_temas dices guardar 0 cuando se trata de un tema nuevo, y no nos dices qué (tal vez el número del tema) cuando es una respuesta. Yo eso no lo entiendo bien. Quiero decir que cuando alguien crea un tema, se crea un nuevo registro en esa tabla y si responde a la misma o visita, suma en los campos que tienes para eso. De ahí que no entienda ese campo tema. Acláranos estas cuestiones y cómo introduces los datos, si puedes con ejemplos concretos para que veamos qué estás haciendo. Dinos además qué quieres sacar exactamente.
  #25 (permalink)  
Antiguo 22/12/2009, 05:36
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: Relacionar 2 tablas

Coincido en lo que jurena dice y agfrego:
- Estás guardando fechas y horas (aparentemente) como números enteros. ¿Por qué?
- Estás poniendo el campo TEMA de la tabla HALF_TEMAS, como INT. ¿Representa una FK? ¿Es otra cosa?
- Hay un campo CONTENIDO definido como TEXT. Si ese es el título del tema, me resulta excesivo, ya que la descripción de un tema abierto por un usuario no debería exceder los 255 caracteres. Lo que sí deben excederlo son los mensajes.
- ¿Dónde guardas los mensajes?
- El campo RESPUESTAS, ¿representa una cantidad o un FK de otra tabla?
- Esto: "int(100)" carece de sentido, porque excede la máxima representación de un número en un BIGINT (18446744073709551615).
- El campo POSISION (debería se posicion), ¿representa la posición como jerarquía de menú, como ranking por resultados, o su posición para un tipo de usuario? ¿O qué posición? Según sea eso, podría ser que correspondiera una relación con otras entidades, y otras tablas, y no necesariamente que estuviese en esta tabla...
- Por cierto, hablando de tablas, ¿Dónde están los mensajes del foro?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #26 (permalink)  
Antiguo 22/12/2009, 11:36
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Bueno les explico como es el sistema xD
- El valor de posicion es para ordenar los foros, por ejemplo: si esta primero el foro Programacion y despues Diseño, con esto puedo mover programacion abajo de diseño.
- Los mensajes estan guardados en half_temas.
- El cambio tema es para referirse al tema, foro o subforo. Y guardo el id del referido.
- Cuardo las fechas en int, para poner bien la fecha por zona horaria.
- El campo contenido tiene el post, y el title tiene el titulo.
- El campo respuestas es para ahorrar consutas xD
Gracias
Salu2
__________________
Half Music - www.halfmusic.com
  #27 (permalink)  
Antiguo 23/12/2009, 02:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Relacionar 2 tablas

pato12,
no sé si habré entendido bien tu lógica, pero tal vez lo que buscas es algo parecido a esto:
Código MySQL:
Ver original
  1. SELECT f.name, SUM(IF (t.tema=0,1,0))totaltemasdeforo, SUM(IF(t.tema!=0,1,0)) respuestas FROM `half_temas` t INNER JOIN half_foros f ON f.id = t.foro group by f.id

Si es así, sigo sin entender qué hace el campo tema en la tabla half_foros, y por otra parte tampoco entiendo que acumules las respuestas y sin embargo para los temas uses un sólo registro, el que tiene 0 en tema. Suscribo todo lo que te dijo gnzsoloyo.

Saludos
  #28 (permalink)  
Antiguo 23/12/2009, 08:48
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: Relacionar 2 tablas

Cita:
Iniciado por pato12 Ver Mensaje
Bueno les explico como es el sistema xD
- El valor de posicion es para ordenar los foros, por ejemplo: si esta primero el foro Programacion y despues Diseño, con esto puedo mover programacion abajo de diseño.
- Los mensajes estan guardados en half_temas.
- El cambio tema es para referirse al tema, foro o subforo. Y guardo el id del referido.
- Cuardo las fechas en int, para poner bien la fecha por zona horaria.
- El campo contenido tiene el post, y el title tiene el titulo.
- El campo respuestas es para ahorrar consutas xD
Gracias
Salu2
Según lo veo yo:
- El primer punto se suele manejarse por medio de una tabla de configuración de menúes por usuario o genérico.
- Los mensajes no suelen guardarse en una tabla que guarde los temas. Lo que suele hacerse es una tabla que guarde el mensaje, relacionada con el tema y con el usuario que lo posteó.
- Guardar las fechas como UNIX_TIME no es una mala idea. Ya lo he visto antes, aunque es poco usual para mi.
- Por lo que se entiende, el campo contenido guarda todos los posts de un tema. Como ya dije, eso suele hacerse en una tabla aparte para evitar entre otras cosas restringir la cantidad de posts posibles (un campo TEXT tiene un límite, aunque sea elevado), y porque además de esa forma se cumple con las 1FN, 2FN y 3FN.
- No comprendo qué consultas ahorras con el campo respuestas porque no sé qué contiene. Sólo puedo suponer...

Dicho esto, te comento, un modelo tipo para un foro lo puedes ver en este esquema simplificado:


No niego que hay muchos otros modelos posibles, pero esta forma cumple el esquema básico de relaciones y cardinalidades mínimas.
La importancia de ajustarse al modelo normalizado (más allá de que uses MyISAM o InnoDB como motor de tablas), es que lo que planteas en el primer post de este asunto sería mucho más fácil de lograr con una consulta más eficiente y efectiva.
Tal y como planteas tu las tablas, tienen ciertas dificultades a la hora de buscar los datos que estás buscando.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #29 (permalink)  
Antiguo 23/12/2009, 11:38
Avatar de pato12  
Fecha de Ingreso: septiembre-2007
Ubicación: Salta
Mensajes: 1.620
Antigüedad: 16 años, 6 meses
Puntos: 101
Respuesta: Relacionar 2 tablas

Cita:
Iniciado por jurena Ver Mensaje
pato12,
no sé si habré entendido bien tu lógica, pero tal vez lo que buscas es algo parecido a esto:
Código MySQL:
Ver original
  1. SELECT f.name, SUM(IF (t.tema=0,1,0))totaltemasdeforo, SUM(IF(t.tema!=0,1,0)) respuestas FROM `half_temas` t INNER JOIN half_foros f ON f.id = t.foro group by f.id

Si es así, sigo sin entender qué hace el campo tema en la tabla half_foros, y por otra parte tampoco entiendo que acumules las respuestas y sin embargo para los temas uses un sólo registro, el que tiene 0 en tema. Suscribo todo lo que te dijo gnzsoloyo.

Saludos
Gracias! anda perfecto .. pero solo me devuelve los post que tengan temas o mensajes :S... yo quiero que me devuelva todos los foros tenga o no temas.


gnzsoloyo, es complicado el sistema que uso xD
__________________
Half Music - www.halfmusic.com
  #30 (permalink)  
Antiguo 23/12/2009, 13:00
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: Relacionar 2 tablas

Código MySQL:
Ver original
  1.     f.name,
  2.     IFNULL(SUM(IF (t.tema=0,1,0)),0) totaltemasdeforo,
  3.     IFNULL(SUM(IF(t.tema!=0,1,0)), 0) respuestas
  4. FROM half_foros f
  5.     LEFT JOIN `half_temas` t ON f.id = t.foro
Tal vez considerando los NULL...

Cita:
es complicado el sistema que uso xD
Más que complicado, me parece demasiado desnormalizado...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 17:20.