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

[SOLUCIONADO] PROBLEMA con una subconsulta de tres tablas

Estas en el tema de PROBLEMA con una subconsulta de tres tablas en el foro de Mysql en Foros del Web. Muy buenas! A ver si consigo explicarme: Tengo tres tablas, ANUNCIOS; IMAGENES y USUARIO los campos: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original CREATE TABLE IF ...
  #1 (permalink)  
Antiguo 16/04/2014, 05:16
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
PROBLEMA con una subconsulta de tres tablas

Muy buenas!

A ver si consigo explicarme:

Tengo tres tablas, ANUNCIOS; IMAGENES y USUARIO

los campos:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `anuncios` (
  2.   `ID` int(5) NOT NULL,
  3.   `TITULO` varchar(50) collate utf8_spanish_ci NOT NULL,
  4.   `DESCRIPCION` varchar(500) collate utf8_spanish_ci NOT NULL,
  5.   `TARIFA` varchar(15) collate utf8_spanish_ci NOT NULL,
  6.   `WEB` varchar(100) collate utf8_spanish_ci NOT NULL,
  7.   `FECHA_INI` date NOT NULL,
  8.   `FECHA_FIN` date NOT NULL,
  9.   `CATEGORIA` int(2) NOT NULL,
  10.   `MAPA` varchar(1000) collate utf8_spanish_ci NOT NULL,
  11.   `DIRECCION` varchar(50) collate utf8_spanish_ci NOT NULL,
  12.   `USUARIO` int(8) NOT NULL,
  13.   `FACEBOOK` varchar(70) collate utf8_spanish_ci NOT NULL,
  14.   `TWITTER` varchar(70) collate utf8_spanish_ci NOT NULL,
  15.   `GOOGLE` varchar(70) collate utf8_spanish_ci NOT NULL,
  16.   PRIMARY KEY  (`TITULO`,`USUARIO`)
  17. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `imagenes` (
  2.   `ID_ANUNCIO` int(5) NOT NULL,
  3.   `NOMBRE` varchar(40) character set utf8 collate utf8_spanish_ci NOT NULL,
  4.   PRIMARY KEY  (`ID_ANUNCIO`,`NOMBRE`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci;

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `usuarios` (
  2.   `DNI` int(8) NOT NULL,
  3.   `USUARIO` varchar(15) character set utf8 collate utf8_spanish_ci NOT NULL,
  4.   `PASSWORD` varchar(12) character set utf8 collate utf8_spanish_ci NOT NULL,
  5.   `EMAIL` varchar(50) character set utf8 collate utf8_spanish_ci NOT NULL,
  6.   PRIMARY KEY  (`DNI`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci;

lo que intento es sacar las imagenes que coincidan con el id de un anuncio de un usuario determinado. Mi consulta es esta:
Código MySQL:
Ver original
  1. SELECT * from imagenes
  2. where ID_ANUNCIO in(SELECT ID from anuncios where USUARIO='25600083')

La consulta me devuelve las imagenes que coincidan con el anuncio y el usuario, pero no en orden, es decir, me muestra las imagenes en un anuncio que no le corresponde. Lo que quiero es que me saque la imagen del anuncio en concreto y no lo hace. EN teoria el id del anuncio y el de la imagen debe coinciden, pero no se porque mi consulta no me devuelve lo que creo que le estoy pidiendo.

Muchisimas gracias!

Última edición por gnzsoloyo; 16/04/2014 a las 07:31
  #2 (permalink)  
Antiguo 16/04/2014, 06:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: PROBLEMA con una subconsulta de tres tablas

Código MySQL:
Ver original
  1. from imagenes I INNER JOIN anuncios A ON I.ID_ANUNCIO=A.ID
  2. where A.USUARIO='25600083';

Esta consulta es equivalente a la que propones tu pero mas eficiente, pero en ambos casos solo estamos filtrando por usuario, y nos retornará TODAS la imagenes de los anuncios del usuario "25600083", si quieres la o las imagenes de un anuncio concreto debes filtrar por el anuncio.

Código MySQL:
Ver original
  1. from imagenes I
  2. where I.ID_ANUNCIO=X;

Ahora dará las imagenes del anuncio X como cada anuncio solo tiene un usuario es innecesario filtrar por el usuario.

Código MySQL:
Ver original
  1. from imagenes I INNER JOIN anuncios A ON I.ID_ANUNCIO=A.ID
  2.                            INNER JOIN usuarios U ON A.usuario=U.usuario
  3. where I.ID_ANUNCIO=X;

(con toda la información)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 21/04/2014, 03:00
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

Ante todo muchas gracias por la respuesta!

He probado tu consulta dándole a x un anuncio en concreto, pero me devuelve 0 columnas... por lo tanto, o hay algo que yo no entiendo o se me escapa algo, no estoy muy familiarizado con los JOIN.

Muchas gracias de nuevo!
  #4 (permalink)  
Antiguo 21/04/2014, 04:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: PROBLEMA con una subconsulta de tres tablas

Cita:
pero me devuelve 0 columnas...
MySQL devolverá 0 resultados si no hay registros que coincidan con el INNER JOIN. Es mandatorio. Si una de las tablas no se relaciona, no devolverá nada.
No es un fallo de la consulta, sino de datos.
__________________
¿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 21/04/2014, 04:46
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

Pero resulta que tengo tablas que si se relacionan, el codigo del anuncio es el mismo que el de la tabla imagen, sin embargo no me devuelve nada... al igual que el id del usuario coinciden en la tabla usuario y anuncio.

No se, volveré a rellenar la bd por si tanto tocar ya no coinciden los campos...
  #6 (permalink)  
Antiguo 21/04/2014, 06:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: PROBLEMA con una subconsulta de tres tablas

Volvamos al principio:
Cita:
lo que intento es sacar las imagenes que coincidan con el id de un anuncio de un usuario determinado. Mi consulta es esta:
Código MySQL:

Código MySQL:
Ver original
  1. SELECT * from imagenes
  2. where ID_ANUNCIO in(SELECT ID from anuncios where USUARIO='25600083')

La consulta me devuelve las imagenes que coincidan con el anuncio y el usuario, pero no en orden, es decir, me muestra las imagenes en un anuncio que no le corresponde. Lo que quiero es que me saque la imagen del anuncio en concreto y no lo hace. EN teoria el id del anuncio y el de la imagen debe coinciden, pero no se porque mi consulta no me devuelve lo que creo que le estoy pidiendo.
Eso tiene todo el aspecto de datos sucios.

Partamos de la base que al usar tablas MyISAM, estás obligado a mantener la consistencia de los datos por programación, lo que en tu caso podría no cumplirse, y no lo detectarías. TEn en cuenta que tu tabla de imagenes tiene como condición que no se repitan los id_anuncio y el nombre de la imagen, pero nada restringe que sean datos válidos.
Para probar si hay datos inconsistentes hay que hacer una consulta:
Código SQL:
Ver original
  1. SELECT *
  2. FROM imagenes I LEFT JOIN anuncios A ON I.ID_ANUNCIO=A.ID
  3. WHERE A.ID IS NULL
Si esta query devuelve algo de la tabla anuncios, son anuncios que no se relacionan con imagenes.

Ahora bien, si esta otra devuelve datos inconsistentes, es decir, imagenes que no pertenecen realmente a los anuncios, lo que tienes son datos sucios:
Código MySQL:
Ver original
  1. FROM imagenes I INNER JOIN anuncios A ON I.ID_ANUNCIO=A.ID

Finalmente, me queda la duda de por qué estás usando esta COLLATION: utf8_slovenian_ci, mientras en los campos tienes utf8_spanish_ci.
¿No sería más sensato unificar la collation de la baser y las tablas a una sola?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 21/04/2014, 08:19
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

ostras, no me habia dado cuenta de la collation... el problema es que somos tres colegas haciendo el proyecto y la base de datos la creo otro, por lo que a la hora de programar con ella no me había fijado en eso...

Refiriendome a lo de las tabla MyISAM, que estoy obligado a mantener consistencia por programación como bien dices, hubiera sido mejor que la bd fuera innodb no? Puede que el problema esté en que los campos no coincidan correctamente entre las tablas...

muchas gracias!
  #8 (permalink)  
Antiguo 21/04/2014, 08:50
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

Veamos a ver, a ver si así podéis dar con el problema, porque menudo quebradero de cabeza jajajaja.

Pondré las tablas con sus campos y los datos volcados y explicaré un poco, porque quizás es que no me explico:

tablas anuncios:

Código PHP:
Ver original
  1. INSERT INTO `anuncios` (`ID`, `TITULO`, `DESCRIPCION`, `TARIFA`, `WEB`, `FECHA_INI`, `FECHA_FIN`, `CATEGORIA`, `MAPA`, `DIRECCION`, `USUARIO`, `FACEBOOK`, `TWITTER`, `GOOGLE`) VALUES
  2. (1398089916, 'perro3', 'perro1 bonito', 'basico', '', '2014-04-21', '2015-04-21', 'RESTAURANTES', '', 'perro', 25600083, '', '', ''),
  3. (1398089905, 'perro2', 'perro1 bonito', 'basico', '', '2014-04-21', '2015-04-21', 'HOTELES', '', 'perro', 25600083, '', '', ''),
  4. (1398089887, 'perro1', 'perro1 bonito', 'basico', '', '2014-04-21', '2015-04-21', 'HOTELES', '', 'perro', 25600083, '', '', '');

Código PHP:
Ver original
  1. INSERT INTO `imagenes` (`ID_ANUNCIO`, `NOMBRE`) VALUES
  2. (1398089887, 'perro.jpg'),
  3. (1398089905, 'perro2.jpg'),
  4. (1398089916, 'perro tres.jpg');

Código PHP:
Ver original
  1. INSERT INTO `usuarios` (`DNI`, `USUARIO`, `PASSWORD`, `EMAIL`, `NOMBRE`, `APELLIDOS`, `DIRECCION`) VALUES
  2. (25600083, 'prueba', '711383a59fda05336fd2ccf70c8059d1523eb41a', '[email protected]', 'PEPE', 'JIMENEZ RUIZ', 'c/cantos n15');

Bien, hay un usuario que ha dado de alta tres anuncios. Cada anuncio tiene una imagen que le corresponde y son el mismo ID

Por más vueltas que le doy me sigue sacando todas las imagenes, pero no la imagen correspondiente a su anuncio, a pesar de que sus id coinciden...

Ademas para facilitar, el nombre de la imagen y el anuncio coinciden, para que se pueda reconocer mejor a simple vista. Mi consulta me devuelve el anuncio "perro1 con la imagen perro2" o "perro2 con perro3" por ejemplo y tanto imagen como anuncio debería ser "perro 1".

Perdón por los nombres pero las imagenes subidas son de perros y de ahi los nombres, para poder reconocerlo mejor...

Muchisimas gracias por vuestra paciencia jaja, a ver si con los datos podéis echarme un cable mejor
  #9 (permalink)  
Antiguo 21/04/2014, 09: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: 17 años
Puntos: 2658
Respuesta: PROBLEMA con una subconsulta de tres tablas

Con los datos que muestras tener, esta query debería devolver sólo tres registros, con todos los datos de ambas tablas:
Código MySQL:
Ver original
  1. SELECT A.*, I.*
  2. FROM imagenes I INNER JOIN anuncios A ON I.ID_ANUNCIO=A.ID
¿Podrías postear el resultado que nos dices que te devuelve? Completo, por favor.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 21/04/2014, 13:41
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

Muchisimas gracias, porque ahora si me saca las imagenes con su correspondiente anuncio, peroooo....

si es otro usuario el que hace la consulta, no coinciden, me explico, he creado otro usuario y he dado de alta dos nuevos anuncios, pero al hacer la consulta de los anuncios que tiene, las imagenes no coinciden, me saca las del primer usuario... y supongo que debe de ser porque tambien hay que controlar en la sentencia que sean las imagenes y anuncios del usuario en concreto...

A todo esto, no me gusta el hecho de ver algo y no entenderla, puedes explicarme en general la consulta?

Aún así muchisimas gracias, porque he dado un gran paso gracias


Esta es lo que me devolvía al principio:
Código PHP:
Ver original
  1. array('ID' => '1398089916','TITULO' => 'perro3','DESCRIPCION' => 'perro1 bonito','TARIFA' => 'basico','WEB' => '','FECHA_INI' => '2014-04-21','FECHA_FIN' => '2015-04-21','CATEGORIA' => 'RESTAURANTES','MAPA' => '','DIRECCION' => 'perro','USUARIO' => '25600083','FACEBOOK' => '','TWITTER' => '','GOOGLE' => '','ID_ANUNCIO' => '1398089916','NOMBRE' => 'perro tres.jpg'),
  2.   array('ID' => '1398089905','TITULO' => 'perro2','DESCRIPCION' => 'perro1 bonito','TARIFA' => 'basico','WEB' => '','FECHA_INI' => '2014-04-21','FECHA_FIN' => '2015-04-21','CATEGORIA' => 'HOTELES','MAPA' => '','DIRECCION' => 'perro','USUARIO' => '25600083','FACEBOOK' => '','TWITTER' => '','GOOGLE' => '','ID_ANUNCIO' => '1398089905','NOMBRE' => 'perro2.jpg'),
  3.   array('ID' => '1398089887','TITULO' => 'perro1','DESCRIPCION' => 'perro1 bonito','TARIFA' => 'basico','WEB' => '','FECHA_INI' => '2014-04-21','FECHA_FIN' => '2015-04-21','CATEGORIA' => 'HOTELES','MAPA' => '','DIRECCION' => 'perro','USUARIO' => '25600083','FACEBOOK' => '','TWITTER' => '','GOOGLE' => '','ID_ANUNCIO' => '1398089887','NOMBRE' => 'perro.jpg'),

Ahora con los dos usuarios creados:
Código PHP:
Ver original
  1. $imagenes = array(
  2.   array('ID' => '1398089916','TITULO' => 'perro3','DESCRIPCION' => 'perro1 bonito','TARIFA' => 'basico','WEB' => '','FECHA_INI' => '2014-04-21','FECHA_FIN' => '2015-04-21','CATEGORIA' => 'RESTAURANTES','MAPA' => '','DIRECCION' => 'perro','USUARIO' => '25600083','FACEBOOK' => '','TWITTER' => '','GOOGLE' => '','ID_ANUNCIO' => '1398089916','NOMBRE' => 'perro tres.jpg'),
  3.   array('ID' => '1398089905','TITULO' => 'perro2','DESCRIPCION' => 'perro1 bonito','TARIFA' => 'basico','WEB' => '','FECHA_INI' => '2014-04-21','FECHA_FIN' => '2015-04-21','CATEGORIA' => 'HOTELES','MAPA' => '','DIRECCION' => 'perro','USUARIO' => '25600083','FACEBOOK' => '','TWITTER' => '','GOOGLE' => '','ID_ANUNCIO' => '1398089905','NOMBRE' => 'perro2.jpg'),
  4.   array('ID' => '1398089887','TITULO' => 'perro1','DESCRIPCION' => 'perro1 bonito','TARIFA' => 'basico','WEB' => '','FECHA_INI' => '2014-04-21','FECHA_FIN' => '2015-04-21','CATEGORIA' => 'HOTELES','MAPA' => '','DIRECCION' => 'perro','USUARIO' => '25600083','FACEBOOK' => '','TWITTER' => '','GOOGLE' => '','ID_ANUNCIO' => '1398089887','NOMBRE' => 'perro.jpg'),
  5.   array('ID' => '1398109055','TITULO' => 'perro4','DESCRIPCION' => 'perro4','TARIFA' => 'basico','WEB' => '','FECHA_INI' => '2014-04-21','FECHA_FIN' => '2015-04-21','CATEGORIA' => 'HOTELES','MAPA' => '','DIRECCION' => 'kjiu','USUARIO' => '11111111','FACEBOOK' => '','TWITTER' => '','GOOGLE' => '','ID_ANUNCIO' => '1398109055','NOMBRE' => 'perro4.jpg'),
  6.   array('ID' => '1398109097','TITULO' => 'gap2','DESCRIPCION' => 'das','TARIFA' => 'basico','WEB' => '','FECHA_INI' => '2014-04-21','FECHA_FIN' => '2015-04-21','CATEGORIA' => 'HOTELES','MAPA' => '','DIRECCION' => 'fds','USUARIO' => '11111111','FACEBOOK' => '','TWITTER' => '','GOOGLE' => '','ID_ANUNCIO' => '1398109097','NOMBRE' => 'ga2.jpg')
  7. );
  #11 (permalink)  
Antiguo 21/04/2014, 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: 17 años
Puntos: 2658
Respuesta: PROBLEMA con una subconsulta de tres tablas

Perdona que insista, pero ¿estamos hablando siempre de esta consulta no?:
Código MySQL:
Ver original
  1. SELECT A.*, I.*
  2. FROM imagenes I INNER JOIN anuncios A ON I.ID_ANUNCIO=A.ID
Estrictamente con esas dos tablas y sólo con ese ON... ¿Es correcto?
Si estás usando una variante, posteala.
__________________
¿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/04/2014, 14:11
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

Si hablamos justo de esa
  #13 (permalink)  
Antiguo 21/04/2014, 14: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: 17 años
Puntos: 2658
Respuesta: PROBLEMA con una subconsulta de tres tablas

Si primero has creado un usuario con tres avisos, y cada aviso con una imagen, debe devolverte tres registros, donde se repetirá el ID del usuario una vez por registro.
Si luego de eso añades un usuario, y dos avisos con su respectiva imagen en cada uno, todo para el segundo usuario, pues la query devolverá cinco registros: Tres (3) del primero, y dos (2) del segundo. No hay error, ni repetición, ni cruzamiento de datos en lo que me dices y lo que posteas.
Francamente no termino de entender cuál es el problema que le ves. hasta lo que puedo analizar, todo es correcto.



Podrías mostrar la tabla (no los arrays) de resultados que tienes, y un ejemplo de lo que supones deberías tener (también como tabla, no como arrays)?

Porque no se ve ningún error en ninguna parte.
__________________
¿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 22/04/2014, 02:54
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

No se como subir la imagen de la tabla de resultados para que la vierais. peor voy a intentar resumirlo.

Tengo dos usuairos, el usuario 256 y el 111

El usuario 256 hace una consulta de todos sus anuncios.

Anuncio perro 3 -imagen perro 3
anuncio perro2 -imagen perro2
anuncio perro1-imagen perro

Ahora es el usuario 111 quien hace la consulta:

Anuncio perro4 - imagen perro3
Anuncio gap2 - imagen perro2 ( aqui la imagen debería ser gap2 tambien, ya que el anuncio y la imagen les pongo el mismo nombre para ver que coinciden).

y la consulta de 111 deberia ser:

Anuncio perro4 - imagen perro4
anuncio gap2 -imagen gap2

No se si aquí lo ves mejor. Yo a la hora de dar de alta un anuncio con el usuario 111 el nombre de la imagen le he puesto el mismo que el del anuncio, de hecho la insercion en la base de datos la hace y coinciden el id del anuncio con el de la imagen, pero la consulta que hace el usuario 111 no me saca las imagenes que le corresponde...

SI hay manera de subir el archivo del volcado de datos en una tabla, diganmelo poruqe no se ocmo es...

Gracias!
  #15 (permalink)  
Antiguo 22/04/2014, 03:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: PROBLEMA con una subconsulta de tres tablas

Lo siento, la información que nos posteas es insuficiente para entender el problema, porque no vemos los datos puros. Es decir, necesitamos los datos de cada tabla por separado con sus respectivas columnas.
Necesitamos reproducir el problema de nuestro lado con los mismos datos que tienes y las mismas tablas.
Tienes dos soluciones posibles:
1) Nos posteas un backup de esa base como script (eso lo puedes obtener con el phpMyadmin).
2) posteas los INSERT de los datos que usas, escritos por ti mismo, aquí.

SIn po rlo menos ver los datos puros (y no descriptos manualmente), no es posible entender lo que dices que sucede.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 22/04/2014 a las 07:00
  #16 (permalink)  
Antiguo 22/04/2014, 10:22
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

Ante todo, muchisimas gracias por la paciencia que tenéis conmigo... llevo poco tiempo programando, y además en cuestiones de base de datos me cuesta un poco más.

Aquí está el script de la base de datos:

Código PHP:
Ver original
  1. -- phpMyAdmin SQL Dump
  2. -- version 3.4.10.1deb1
  3. -- http://www.phpmyadmin.net
  4. --
  5. -- Servidor: localhost
  6. -- Tiempo de generación: 22-04-2014 a las 18:13:59
  7. -- Versión del servidor: 5.5.35
  8. -- Versión de PHP: 5.3.10-1ubuntu3.11
  9.  
  10. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  11. SET time_zone = "+00:00";
  12.  
  13.  
  14. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  15. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  16. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  17. /*!40101 SET NAMES utf8 */;
  18.  
  19. --
  20. -- Base de datos: `portal`
  21. --
  22.  
  23. -- --------------------------------------------------------
  24.  
  25. --
  26. -- Estructura de tabla para la tabla `anuncios`
  27. --
  28.  
  29. CREATE TABLE IF NOT EXISTS `anuncios` (
  30.   `ID` int(10) NOT NULL,
  31.   `TITULO` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
  32.   `DESCRIPCION` varchar(500) COLLATE utf8_spanish_ci NOT NULL,
  33.   `TARIFA` varchar(15) COLLATE utf8_spanish_ci NOT NULL,
  34.   `WEB` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
  35.   `FECHA_INI` date NOT NULL,
  36.   `FECHA_FIN` date NOT NULL,
  37.   `CATEGORIA` varchar(20) COLLATE utf8_spanish_ci NOT NULL,
  38.   `MAPA` varchar(1000) COLLATE utf8_spanish_ci NOT NULL,
  39.   `DIRECCION` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
  40.   `USUARIO` int(8) NOT NULL,
  41.   `FACEBOOK` varchar(70) COLLATE utf8_spanish_ci NOT NULL,
  42.   `TWITTER` varchar(70) COLLATE utf8_spanish_ci NOT NULL,
  43.   `GOOGLE` varchar(70) COLLATE utf8_spanish_ci NOT NULL,
  44.   PRIMARY KEY (`TITULO`,`USUARIO`)
  45. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  46.  
  47. --
  48. -- Volcado de datos para la tabla `anuncios`
  49. --
  50.  
  51. INSERT INTO `anuncios` (`ID`, `TITULO`, `DESCRIPCION`, `TARIFA`, `WEB`, `FECHA_INI`, `FECHA_FIN`, `CATEGORIA`, `MAPA`, `DIRECCION`, `USUARIO`, `FACEBOOK`, `TWITTER`, `GOOGLE`) VALUES
  52. (1398089916, 'perro3', 'perro1 bonito', 'basico', '', '2014-04-21', '2015-04-21', 'RESTAURANTES', '', 'perro', 25600083, '', '', ''),
  53. (1398089905, 'perro2', 'perro1 bonito', 'basico', '', '2014-04-21', '2015-04-21', 'HOTELES', '', 'perro', 25600083, '', '', ''),
  54. (1398089887, 'perro1', 'perro1 bonito', 'basico', '', '2014-04-21', '2015-04-21', 'HOTELES', '', 'perro', 25600083, '', '', ''),
  55. (1398109055, 'perro4', 'perro4', 'basico', '', '2014-04-21', '2015-04-21', 'HOTELES', '', 'kjiu', 11111111, '', '', ''),
  56. (1398109097, 'gap2', 'das', 'basico', '', '2014-04-21', '2015-04-21', 'HOTELES', '', 'fds', 11111111, '', '', '');
  57.  
  58. -- --------------------------------------------------------
  59.  
  60. --
  61. -- Estructura de tabla para la tabla `categorias`
  62. --
  63.  
  64. CREATE TABLE IF NOT EXISTS `categorias` (
  65.   `ID` int(2) NOT NULL AUTO_INCREMENT,
  66.   `NOMBRE` varchar(20) COLLATE utf8_spanish_ci NOT NULL,
  67.   PRIMARY KEY (`ID`)
  68. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=3 ;
  69.  
  70. --
  71. -- Volcado de datos para la tabla `categorias`
  72. --
  73.  
  74. INSERT INTO `categorias` (`ID`, `NOMBRE`) VALUES
  75. (1, 'HOTELES'),
  76. (2, 'RESTAURANTES');
  77.  
  78. -- --------------------------------------------------------
  79.  
  80. --
  81. -- Estructura de tabla para la tabla `comentarios`
  82. --
  83.  
  84. CREATE TABLE IF NOT EXISTS `comentarios` (
  85.   `DNI_USUARIO` int(8) NOT NULL,
  86.   `ID_ANUNCIO` int(5) NOT NULL,
  87.   `COMENTARIO` varchar(200) COLLATE utf8_spanish_ci NOT NULL,
  88.   PRIMARY KEY (`DNI_USUARIO`,`ID_ANUNCIO`,`COMENTARIO`)
  89. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  90.  
  91. -- --------------------------------------------------------
  92.  
  93. --
  94. -- Estructura de tabla para la tabla `imagenes`
  95. --
  96.  
  97. CREATE TABLE IF NOT EXISTS `imagenes` (
  98.   `ID_ANUNCIO` int(10) NOT NULL,
  99.   `NOMBRE` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
  100.   PRIMARY KEY (`ID_ANUNCIO`,`NOMBRE`)
  101. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  102.  
  103. --
  104. -- Volcado de datos para la tabla `imagenes`
  105. --
  106.  
  107. INSERT INTO `imagenes` (`ID_ANUNCIO`, `NOMBRE`) VALUES
  108. (1398089887, 'perro.jpg'),
  109. (1398089905, 'perro2.jpg'),
  110. (1398089916, 'perro tres.jpg'),
  111. (1398109055, 'perro4.jpg'),
  112. (1398109097, 'ga2.jpg');
  113.  
  114. -- --------------------------------------------------------
  115.  
  116. --
  117. -- Estructura de tabla para la tabla `noticias`
  118. --
  119.  
  120. CREATE TABLE IF NOT EXISTS `noticias` (
  121.   `TITULO` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
  122.   `TEXTO` varchar(2000) COLLATE utf8_spanish_ci NOT NULL,
  123.   `IMAGEN` varchar(40) COLLATE utf8_spanish_ci DEFAULT NULL,
  124.   `FUENTE` varchar(200) COLLATE utf8_spanish_ci DEFAULT NULL,
  125.   `FECHA` date NOT NULL
  126. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  127.  
  128. -- --------------------------------------------------------
  129.  
  130. --
  131. -- Estructura de tabla para la tabla `usuarios`
  132. --
  133.  
  134. CREATE TABLE IF NOT EXISTS `usuarios` (
  135.   `DNI` int(8) NOT NULL,
  136.   `USUARIO` varchar(15) COLLATE utf8_spanish_ci NOT NULL,
  137.   `PASSWORD` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
  138.   `EMAIL` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
  139.   `NOMBRE` varchar(30) CHARACTER SET ucs2 COLLATE ucs2_spanish_ci NOT NULL,
  140.   `APELLIDOS` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
  141.   `DIRECCION` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
  142.   PRIMARY KEY (`DNI`)
  143. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  144.  
  145. --
  146. -- Volcado de datos para la tabla `usuarios`
  147. --
  148.  
  149. INSERT INTO `usuarios` (`DNI`, `USUARIO`, `PASSWORD`, `EMAIL`, `NOMBRE`, `APELLIDOS`, `DIRECCION`) VALUES
  150. (25600083, 'prueba', '711383a59fda05336fd2ccf70c8059d1523eb41a', '[email protected]', 'PEPE', 'JIMENEZ RUIZ', 'c/cantos n15'),
  151. (11111111, 'antonio', '356a192b7913b04c54574d18c28d46e6395428ab', '[email protected]', '', '', '');
  152.  
  153. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  154. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  155. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  #17 (permalink)  
Antiguo 23/04/2014, 03:15
 
Fecha de Ingreso: noviembre-2012
Mensajes: 97
Antigüedad: 12 años
Puntos: 1
Respuesta: PROBLEMA con una subconsulta de tres tablas

Solucionado, he conseguido que me diera los anuncios segun el usuario.
Código PHP:
Ver original
  1. SELECT DISTINCT A.*, I.*
  2. FROM imagenes I INNER JOIN anuncios A ON I.ID_ANUNCIO=A.ID and A.USUARIO='$user'

Donde $user es el usuario logeado.

Lo digo, muchisimas gracias, sin vosotros no podría haberlo conseguido, sobretodo gracias a gnzsoloyo, gracias a personas como tu, los que menos sabemos podemos avanzar y aprender,

Gracias!
  #18 (permalink)  
Antiguo 23/04/2014, 04:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: PROBLEMA con una subconsulta de tres tablas

Código MySQL:
Ver original
  1. SELECT DISTINCT A.*, I.*
  2. FROM imagenes I INNER JOIN anuncios A ON I.ID_ANUNCIO=A.ID
  3. WHERE A.USUARIO='$user'


Creo que nunca terminaste de decirlo claramente, porque esa hubiese sido una respuesta de treinta segundos (el tiempo de mandar el post).
Lo que estabas diciendo era esto:
Cita:
La consulta me devuelve las imagenes que coincidan con el anuncio y el usuario, pero no en orden, es decir, me muestra las imagenes en un anuncio que no le corresponde.
Y eso no es lo mismo que buscar las imágenes de un determinado usuario.
Son cosas diferentes.
Que en un anuncio salgan las imagenes de otro, usando INNER JOIN, implica datos sucios o consultas mal relacionadas. Pero que te salgan los anuncios de todos, significa que no sabes usar el WHERE. No es lo mismo.

Yo estaba, partiendo d elo que decías, buscando problemas de relación entre los datos... y no los encontraba.

´Para la próxima trata de explicar claramente y de forma precisa cuál es el error. ASí no perdemos tiempo buscando fantasmas.

__________________
¿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: campo, null, php, select, subconsulta, tabla, tablas, tres, usuarios
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 12:08.