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

Consulta Tablas Relacionales

Estas en el tema de Consulta Tablas Relacionales en el foro de Mysql en Foros del Web. Hola, a ver, estoy intentando hacer una consulta con tablas relacionales, una llamada foro y otra usuarios, en la tabla foro se guardan los mensajes ...
  #1 (permalink)  
Antiguo 02/01/2013, 19:09
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Consulta Tablas Relacionales

Hola, a ver, estoy intentando hacer una consulta con tablas relacionales, una llamada foro y otra usuarios, en la tabla foro se guardan los mensajes de los usuarios, en vez de guardar el nick del usuario guardo el idusuario, que seria el campo que relacionaria esta tabla con la tabla usuario. Al hacer la consulta lo que intento es que al mostrar el mensaje en vez del idusuario muestre el nick, no lo consigo y no se que más hacer, os dejo el código que tengo.
Código MySQL:
Ver original
  1. SELECT id, foro.idusuario, titulo, fecha, respuestas, ult_respuesta, nick
  2. FROM foro, usuarios
  3. WHERE nick=idusuario, identificador=0
  4. ORDER BY ult_respuesta DESC;
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)

Última edición por gnzsoloyo; 02/01/2013 a las 19:51 Razón: Código SQL mal etiquetado.
  #2 (permalink)  
Antiguo 02/01/2013, 19:14
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Consulta Tablas Relacionales

¿Cuál es la estructura de ambas tablas?

Es conveniente que uses JOIN en lugar de hacer la unión implícita en el WHERE.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 02/01/2013, 19:54
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Respuesta: Consulta Tablas Relacionales

ok, el nick ya me sale, pero ahora me saca sólo un mensaje de dos que hay en la base de datos y además me saca el mensaje repetido, uno por cada usuario que hay registrado, aunque no sean los autores.


Así está el código ahora:

Código SQL:
Ver original
  1. SELECT f.id, f.idusuario, f.titulo, f.fecha, f.respuestas, f.ult_respuesta, u.nick
  2. FROM foro f JOIN usuarios u ON u.nick=f.idusuario
  3. WHERE identificador=0
  4. ORDER BY ult_respuesta DESC;
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)

Última edición por gnzsoloyo; 02/01/2013 a las 20:02
  #4 (permalink)  
Antiguo 02/01/2013, 20:05
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: Consulta Tablas Relacionales

Postea la estructura de las tablas (el CREATE TABLE, no una descripción) y un ejemplo de los datos que contiene cada tabla.
En principio, parece que estás intentando relacionar datos que no están correctamente vinculados, tal vez generando un producto cartesiano. Pero sin ver ejemplos de registros de cada tabla es difícil de precisar.

Viendo esto:
Cita:
en vez de guardar el nick del usuario guardo el idusuario
Se podría decir que no has entendido cómo funciona el JOIN (implícito o explícito), porque para que devuelva datos debes relacionar datos que sean exactamente los mismos.
Es decir, no puedes relacionar un "nick", con un "idusuario", a menos el nick sea también el idusuario.

Algo como:
Código MySQL:
Ver original
  1. SELECT f.id, f.idusuario, u.nick, f.titulo, f.fecha, f.respuestas, f.ult_respuesta
  2. FROM foro f INNER JOIN usuarios u ON u.idusuario = f.idusuario
  3. WHERE identificador=0
  4. ORDER BY ult_respuesta 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)
  #5 (permalink)  
Antiguo 02/01/2013, 20:11
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Respuesta: Consulta Tablas Relacionales

Código MySQL:
Ver original
  1. --
  2. -- Estructura de tabla para la tabla `foro`
  3. --
  4.  
  5. CREATE TABLE `foro` (
  6.   `id` int(11) NOT NULL auto_increment,
  7.   `Idusuario` int(11) NOT NULL,
  8.   `titulo` varchar(200) collate utf8_unicode_ci NOT NULL,
  9.   `mensaje` text collate utf8_unicode_ci NOT NULL,
  10.   `fecha` datetime NOT NULL default '0000-00-00 00:00:00',
  11.   `respuestas` int(11) NOT NULL,
  12.   `identificador` int(7) NOT NULL,
  13.   `ult_respuesta` datetime default NULL,
  14.   PRIMARY KEY  (`id`)
  15. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
  16.  
  17. --
  18. -- Volcar la base de datos para la tabla `foro`
  19. --
  20.  
  21. INSERT INTO `foro` VALUES (1, 4, 'probando', 'Este es un mensaje de prueba', '2013-01-02 00:00:00', 0, 0, '2013-01-02 00:00:00');
  22. INSERT INTO `foro` VALUES (2, 6, 'Otra Prueba', 'Segundo mensaje de prueba', '2013-01-02 00:14:47', 3, 0, '2013-01-02 00:14:47');
  23.  
  24.  
  25. --
  26. -- Estructura de tabla para la tabla `usuarios`
  27. --
  28.  
  29. CREATE TABLE `usuarios` (
  30.   `Idusuario` int(11) NOT NULL auto_increment,
  31.   `nick` varchar(20) character set utf8 collate utf8_unicode_ci NOT NULL,
  32.   `nombre` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL,
  33.   `apellidos` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL,
  34.   `rol` int(1) NOT NULL,
  35.   `fechnacimiento` date NOT NULL,
  36.   `email` varchar(50) character set utf8 collate utf8_unicode_ci NOT NULL,
  37.   `password` varchar(8) character set utf8 collate utf8_unicode_ci NOT NULL,
  38.   PRIMARY KEY  (`Idusuario`)
  39. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
  40.  
  41. --
  42. -- Volcar la base de datos para la tabla `usuarios`
  43. --
  44.  
  45. INSERT INTO `usuarios` VALUES (5, 'manolo', 'Manolo', 'Jiménez', 1, '1976-07-31', '[email protected]', '31071976');
  46. INSERT INTO `usuarios` VALUES (4, 'lynxstyle', 'Manuel Jesús', 'Jiménez Garrido', 2, '1976-07-31', '[email protected]', '31071976');
  47. INSERT INTO `usuarios` VALUES (6, 'manolillo', 'Manolillo', 'Jiménez', 1, '1976-07-31', '[email protected]', '31071976');
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)

Última edición por gnzsoloyo; 02/01/2013 a las 20:17 Razón: Codigo sin etiquetar. Por favor, usar Highlight "MySQL" que se halla en el combo.
  #6 (permalink)  
Antiguo 02/01/2013, 20:21
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Respuesta: Consulta Tablas Relacionales

Cita:
Iniciado por gnzsoloyo Ver Mensaje

Viendo esto:
Se podría decir que no has entendido cómo funciona el JOIN (implícito o explícito), porque para que devuelva datos debes relacionar datos que sean exactamente los mismos.
Es decir, no puedes relacionar un "nick", con un "idusuario", a menos el nick sea también el idusuario.

Algo como:
Código MySQL:
Ver original
  1. SELECT f.id, f.idusuario, u.nick, f.titulo, f.fecha, f.respuestas, f.ult_respuesta
  2. FROM foro f INNER JOIN usuarios u ON u.idusuario = f.idusuario
  3. WHERE identificador=0
  4. ORDER BY ult_respuesta DESC;
Funciona, muchas gracias
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)
  #7 (permalink)  
Antiguo 02/01/2013, 20: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, 5 meses
Puntos: 2658
Respuesta: Consulta Tablas Relacionales

Con tu estructura y datos, mas la consulta que te propongo en el último post, este es el resultado:
Código MySQL:
Ver original
  1. mysql> SELECT f.id, f.idusuario, u.nick, f.titulo, f.fecha, f.respuestas, f.ult_respuesta
  2.     -> FROM foro f INNER JOIN usuarios u ON u.idusuario = f.idusuario
  3.     -> WHERE identificador=0
  4.     -> ORDER BY ult_respuesta DESC;
  5. +----+-----------+-----------+-------------+---------------------+------------+---------------------+
  6. | id | idusuario | nick      | titulo      | fecha               | respuestas | ult_respuesta       |
  7. +----+-----------+-----------+-------------+---------------------+------------+---------------------+
  8. |  2 |         6 | manolillo | Otra Prueba | 2013-01-02 00:14:47 |          3 | 2013-01-02 00:14:47 |
  9. |  1 |         4 | lynxstyle | probando    | 2013-01-02 00:00:00 |          0 | 2013-01-02 00:00:00 |
  10. +----+-----------+-----------+-------------+---------------------+------------+---------------------+
  11. 2 rows in set (0.00 sec)

Con lo que hacías tu:
Código MySQL:
Ver original
  1. mysql> SELECT f.id, f.idusuario, f.titulo, f.fecha, f.respuestas, f.ult_respuesta, u.nick
  2.     -> FROM foro f JOIN usuarios u ON u.nick=f.idusuario
  3.     -> WHERE identificador=0
  4.     -> ORDER BY ult_respuesta DESC;
  5. Empty set (0.00 sec)

Con la inicial:
Código MySQL:
Ver original
  1. mysql> SELECT id, foro.idusuario, titulo, fecha, respuestas, ult_respuesta, nick
  2.     -> FROM foro, usuarios
  3.     -> WHERE nick=idusuario, identificador=0
  4.     -> ORDER BY ult_respuesta DESC;
  5. ERROR 1064 (42000): You have an error in your SQL syntax;
  6. check the manual that corresponds to your MySQL server version
  7. for the right syntax to use near ' identificador=0 ORDER BY ult_respuesta DESC' at line 3
No veo cómo podías obtener respuestas de esa consulta... ¿Estás seguro de haberla copiado bien?

Como sea, la sintaxis que te propongo funciona. Ahora hay que ver si cumple con lo que quieres...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 02/01/2013, 20:31
 
Fecha de Ingreso: julio-2005
Mensajes: 304
Antigüedad: 18 años, 9 meses
Puntos: 4
Respuesta: Consulta Tablas Relacionales

gnzsoloyo gracias, funciona correctamente, ahora me lio con otro pero ya pille la idea, muchas gracias de nuevo.
__________________
http://www.lynxstyle.net

En la vida como en el ajedrez, hay un reloj que marca el tiempo de cada movimiento, si lo consumes pierde (MJJG)

Etiquetas: select, sql, tabla, tablas, campos
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 08:58.