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

problema con consulta

Estas en el tema de problema con consulta en el foro de Mysql en Foros del Web. Hola tengo un problema estoy haciendo algo como una red social y quiero ver las "noticias" de los amigos de el usuario loguado tengo esta ...
  #1 (permalink)  
Antiguo 17/06/2010, 06:43
Avatar de dyegox  
Fecha de Ingreso: enero-2008
Mensajes: 173
Antigüedad: 16 años, 3 meses
Puntos: 7
problema con consulta

Hola tengo un problema estoy haciendo algo como una red social y quiero ver las "noticias" de los amigos de el usuario loguado

tengo esta consulta:
Código SQL:
Ver original
  1. SELECT a.id, a.username, a.email, b.update_id, b.UPDATE, b.TIME, b.user_id_fk FROM usuarios a, updates b, relationships c WHERE b.user_id_fk = a.id AND c.user_from = $user_id AND b.user_id_fk = c.user_to AND c.STATUS = '1' LIMIT 15

donde $user_id es el id del usuario logueado, pero solo me muestra un solo resultado aca les dejo mis tablas

tabla usuarios:
Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `usuarios` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `username` VARCHAR(30) NOT NULL,
  4.   `name` text,
  5.   `surname` text,
  6.   `login` INT(1) NOT NULL,
  7.   `password` VARCHAR(80) NOT NULL,
  8.   `email` VARCHAR(250) DEFAULT NULL,
  9.   `picture` text NOT NULL,
  10.   `b_day` VARCHAR(2) NOT NULL,
  11.   `b_month` VARCHAR(2) NOT NULL,
  12.   `b_year` VARCHAR(4) NOT NULL,
  13.   `level` VARCHAR(250) NOT NULL DEFAULT 'NormalUser',
  14.   `ip` VARCHAR(250) NOT NULL,
  15.   `profile_visit` INT(11) NOT NULL,
  16.   `lastl` VARCHAR(250) NOT NULL,
  17.   `pprivate` tinyint(1) NOT NULL DEFAULT '0',
  18.   `active` INT(1) NOT NULL DEFAULT '0',
  19.   `activecode` VARCHAR(250) NOT NULL,
  20.   `suspend` INT(1) NOT NULL DEFAULT '0',
  21.   `country` VARCHAR(250) NOT NULL,
  22.   `sex` INT(2) NOT NULL DEFAULT '0',
  23.   `interests` text,
  24.   `www` VARCHAR(255) DEFAULT NULL,
  25.   UNIQUE KEY `id` (`id`)
  26. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

tabla updates:
Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `updates` (
  2.   `update_id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `update` text,
  4.   `time` INT(11) DEFAULT NULL,
  5.   `user_id_fk` INT(11) DEFAULT NULL,
  6.   PRIMARY KEY (`update_id`),
  7.   KEY `user_id_fk` (`user_id_fk`)
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
aca user_id_fk es el id del usuario

tabla relationships:
Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `relationships` (
  2.   `user_from` INT(11) NOT NULL,
  3.   `user_to` INT(11) NOT NULL,
  4.   `status` enum('0','1') NOT NULL DEFAULT '0'
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
en status 0 es pendiente y 1 es aceptada

yase qe puede ser algo tonto pero no estoy familiarizado con consultas extensas

Gracias !!
  #2 (permalink)  
Antiguo 17/06/2010, 07:25
 
Fecha de Ingreso: mayo-2009
Mensajes: 76
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: problema con consulta

Código SQL:
Ver original
  1. SELECT a.id, a.username, a.email, b.update_id, b.UPDATE, b.TIME, b.user_id_fk FROM usuarios a INNER JOIN updates b ON (a.id = b.user_id_fk) INNER JOIN  relationships  c ON (c.user_from = $user_id AND  c.user_to =  b.user_id_fk ) WHERE  c.STATUS = '1'



no lo he probado....
  #3 (permalink)  
Antiguo 17/06/2010, 07:41
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: problema con consulta

Hay al menos cuatro cosas a resaltar:

1) Estás usando palabras reservadas como nombres de campos, lo que puede dar lugar a comportamientos erráticos..

2) El uso de la coma (sinónimo de JOIN) puede generar comportamientos también erráticos, porque MySQL intenta emparejar los campos con el mismo nombre, con lo que puede cruzar campos con dominios incompatibles. Es preferible usar INNER JOIN para hacer estas juntas, ya que de ese modo sólo se relacionan campos específicos.

3) El orden de los factores altera el producto en los JOIN. El orden de las relaciones de campos debe ser puesto en el mismo orden que las tablas. Es más eficiente.

4) Ten en cuenta que si usas AND en un WHERE para todas las condiciones, se deben cumplir todas sin excepción para devolver datos. Habría que analizar el contenido de las tablas para saber si hay otros registros que cumplan efectivamente con todas...

Probemos:
Código MySQL:
Ver original
  1.   a.id,
  2.   a.username,
  3.   a.email,
  4.   b.update_id,
  5.   b.`UPDATE`,
  6.   b.`time`,
  7.   b.user_id_fk
  8.   usuarios a
  9.   INNER JOIN updates b ON a.id = b.user_id_fk
  10.   INNER JOIN relationships c ON b.user_id_fk = c.user_to
  11.   c.user_from = $user_id AND c.`STATUS` = '1'

No hay que olvidarse, tampoco, que un INNER JOIN devolverá registros si y sólo si existen registros que coincidan entre las tres tablas, además de las condiciones del WHERE.
__________________
¿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: Ninguno
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:37.