[Php-avanzado] Consulta entre dos tablas

Matias Gea matigea en gmail.com
Vie Oct 1 18:54:48 ART 2010


Probá con algo así:

SELECT news.id, tit, cop, des, fecha, data.ruta AS img
FROM news
LEFT JOIN data
ON data.id = (SELECT data.id FROM data WHERE data.id_news=news.id ORDER BY
data.id DESC LIMIT 1)
AND data.tipo = 'img'
ORDER by news.fecha DESC, news.id DESC

Igualmente, no estoy a favor de las subconsultas. En la mayoría de los casos
se pueden evitar o reemplazar con algo mucho más eficiente. En un sitio con
poco tráfico no son influyentes, pero a medida que el tráfico y la cantidad
de consultas por página aumenta, se hace importante optimizar.

Igual, si te sirve una subconsulta, la hacemos funcionar y la optimizamos un
poco (por el tema de los indices).

Saludos!

El 1 de octubre de 2010 18:43, Silverzero <silverzero.52 en gmail.com>escribió:

> Ahi mando!
>
> Estructura de tabla para la tabla `data`
> --
>
> CREATE TABLE IF NOT EXISTS `data` (
>   `id` int(11) NOT NULL auto_increment,
>   `id_news` int(11) NOT NULL,
>   `ruta` text collate utf8_unicode_ci NOT NULL,
>   `tipo` varchar(50) collate utf8_unicode_ci NOT NULL,
>   `titulo` varchar(255) collate utf8_unicode_ci NOT NULL,
>   PRIMARY KEY  (`id`)
> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
> AUTO_INCREMENT=17 ;
>
> --
> -- Volcar la base de datos para la tabla `data`
> --
>
> INSERT INTO `data` (`id`, `id_news`, `ruta`, `tipo`) VALUES
> (13, 23, 'archivo.ppt', 'file),
> (14, 23, 'img1.jpg', 'img'),
> (15, 24, 'img2.jpg', 'img'),
> (16, 24, 'img3.jpg', 'img');
>
> Estructura de tabla para la tabla `news`
> --
>
> CREATE TABLE IF NOT EXISTS `news` (
>   `id` int(11) NOT NULL auto_increment,
>   `usr_id` int(11) NOT NULL,
>   `fecha` date NOT NULL,
>   `tit` varchar(255) collate utf8_unicode_ci NOT NULL,
>   `cop` text collate utf8_unicode_ci NOT NULL,
>   `des` text collate utf8_unicode_ci NOT NULL,
>   PRIMARY KEY  (`id`)
> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
> AUTO_INCREMENT=25 ;
>
> Volcar la base de datos para la tabla `news`
> --
>
> INSERT INTO `news` (`id`, `usr_id`, `fecha`, `tit`, `cop`, `des`) VALUES
> (24, 1, '2010-09-10', 'Lorem ipsum dolor sit amet, consectetuer adipiscing
> elit. ', 'Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum.
> Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper
> ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget
> condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque
> sed ipsum.', ' Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id,
> lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut
> libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros
> faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec
> sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue
> velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend
> sapien.'), (23, 1, '2010-09-14', 'Lorem ipsum dolor sit amet, consectetuer
> adipiscing elit. ', 'Phasellus viverra nulla ut metus varius laoreet.
> Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur
> ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus,
> tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing
> sem neque sed ipsum.', ' Nam quam nunc, blandit vel, luctus pulvinar,
> hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae
> sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci
> eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh.
> Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales,
> augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate
> eleifend sapien.');
>
>
>
>
> 2010/10/1 Leonardo Tadei - Pegasus Tech Supply <
> leonardot en pegasusnet.com.ar>
>
>> Carolina,
>>
>> El vie, 01-10-2010 a las 13:06 -0300, Silverzero escribió:
>> > No te dije que "efecto" era: me repite la misma imagen para todas las
>> > publicaciones listadas.
>>
>>         Entonces falta algún alias para desambiguar un campo de la query
>> respecto de la subquery...
>>        De veras, mandá la estructura de las 2 tablas y un par de datos de
>> pruebas y lo vemos!
>>
>>
>> > 2010/10/1 Silverzero <silverzero.52 en gmail.com>
>> >         No anda lo que se te habia ocurrido...eso me hace el mismo
>> >         efecto que había hecho anteriormente con
>> >
>> >         SELECT
>> >                     news.id,
>> >                     tit,
>> >                     cop,
>> >                     des,
>> >                     fecha,
>> >
>> >                     (SELECT ruta FROM data, news WHERE news.id=id_news
>> >         LIMIT 0,1) as img
>> >
>> >                 FROM
>> >                     news
>> >                 LEFT JOIN
>> >                     data
>> >                 ON  news.id = id_news AND tipo = 'img'
>> >                 ORDER by
>> >                     fecha DESC,
>> >                     id DESC
>> >
>> >
>> >         Ya fué, lo dejo con GROUP BY, más adelante trataré de
>> >         resolverlo, porque seguro en algun momento voy a necesitar
>> >         listar algo con otro algo específico de un grupo en
>> >         particular.
>> >
>> >
>> >
>> >         2010/10/1 Leonardo Tadei - Pegasus Tech Supply
>> >         <leonardot en pegasusnet.com.ar>
>> >                 Entonces, una subquery con la forma:
>> >
>> >                 SELECT
>> >                             news.id,
>> >                             tit,
>> >                             cop,
>> >                             des,
>> >                             fecha,
>> >                             ruta as img
>> >                         FROM
>> >                             news
>> >                         LEFT JOIN
>> >                             data
>> >
>> >                         ON  news.id = (SELECT id_news FROM data WHERE
>> >                 news.id=id_news
>> >                 LIMIT 0,1)
>> >                                AND tipo = 'img'
>> >                         ORDER by
>> >                             fecha DESC,
>> >                             id DESC
>> >
>> >
>> >                        Es decir, hacés el LEFT JOIN relacionando
>> >                 news.id con el resultado de
>> >                 una query que te devuelve solo un registro de data.
>> >                        Puede ser que haga falta usar algún alias para
>> >                 desambiguar algún campo,
>> >                 pero la idea es esa...
>> >
>> >                 El vie, 01-10-2010 a las 09:01 -0300, Silverzero
>> >                 escribió:
>> >
>> >                 > Si, DISTINCT tambien lo había probado pero no me
>> >                 funcionó... :/
>> >                 >
>> >                 > 2010/10/1 Leonardo Tadei - Pegasus Tech Supply
>> >                 > <leonardot en pegasusnet.com.ar>
>> >                 >         Ahhh!!!
>> >                 >
>> >                 >         Entonces, sacale el LIMIT que te había
>> >                 dicho, y comenzá la
>> >                 >         query con
>> >                 >         SELECT DISTINCT ...
>> >                 >
>> >                 >                Sin embargo, tal vez esto no funcione
>> >                 porque en
>> >                 >         realidad las filas no
>> >                 >         estarán repetidas cuando haya distintas
>> >                 imágenes... probalo y
>> >                 >         contanos,
>> >                 >         y si no vamos a tener que armar una subquery
>> >                 que devuelva solo
>> >                 >         un
>> >                 >         registro por cada noticia.
>> >                 >
>> >                 >         El vie, 01-10-2010 a las 08:38 -0300,
>> >                 Silverzero escribió:
>> >                 >
>> >                 >         > Si, pero en ese caso me lista una noticia
>> >                 sola, no?.
>> >                 >         > Yo quiero un listado completo de noticias
>> >                 por página, en
>> >                 >         donde cada
>> >                 >         > noticia se muestra con ninguna (si no
>> >                 tuviese) o sólo una
>> >                 >         imagen, para
>> >                 >         > que luego se pueda seleccionar una y ver
>> >                 todo el contenido
>> >                 >         completo.
>> >                 >         >
>> >                 >         > 2010/10/1 Leonardo Tadei - Pegasus Tech
>> >                 Supply
>> >                 >         > <leonardot en pegasusnet.com.ar>
>> >                 >         >         Hola Carolina,
>> >                 >         >
>> >                 >         >                si solo querías la primer
>> >                 imagen, tu 1er
>> >                 >         query estaba
>> >                 >         >         bien, solo que al
>> >                 >         >         final tenías que agregarle un
>> >                 LIMIT 0,1
>> >                 >         >
>> >                 >         >                El LIMIT es a toda la
>> >                 query...
>> >                 >         >
>> >                 >         >         El vie, 01-10-2010 a las 07:30
>> >                 -0300, Silverzero
>> >                 >         escribió:
>> >                 >         >
>> >                 >         >         > No, solo una. Porque es para el
>> >                 listado de todas
>> >                 >         las
>> >                 >         >         noticias, y
>> >                 >         >         > queria que se mostrara cada una
>> >                 con una imagen de
>> >                 >         todas las
>> >                 >         >         que
>> >                 >         >         > tuviera asociadas (hubiera sido
>> >                 ideal la de menor
>> >                 >         ID).
>> >                 >         >         >
>> >                 >         >         > 2010/10/1 Leonardo Tadei -
>> >                 Pegasus Tech Supply
>> >                 >         >         > <leonardot en pegasusnet.com.ar>
>> >                 >         >         >         Pero esa query no te
>> >                 devuelve todas las
>> >                 >         imágenes...
>> >                 >         >         no te
>> >                 >         >         >         hacían falta
>> >                 >         >         >         todas???
>> >                 >         >         >
>> >                 >         >         >         El vie, 01-10-2010 a las
>> >                 00:24 -0300,
>> >                 >         Silverzero
>> >                 >         >         escribió:
>> >                 >         >         >
>> >                 >         >         >         > Hola Leo,
>> >                 >         >         >         >
>> >                 >         >         >         > Gracias por la
>> >                 respuesta.
>> >                 >         >         >         > Lo arreglé así:
>> >                 >         >         >         >
>> >                 >         >         >         >     $qry="SELECT
>> >                 >         >         >         >             news.id,
>> >                 >         >         >         >             tit,
>> >                 >         >         >         >             cop,
>> >                 >         >         >         >             des,
>> >                 >         >         >         >             fecha,
>> >                 >         >         >         >             ruta as
>> >                 img
>> >                 >         >         >         >         FROM
>> >                 >         >         >         >             news
>> >                 >         >         >         >         LEFT JOIN
>> >                 >         >         >         >             data
>> >                 >         >         >         >         ON
>> >                 >         >         >         >             news.id =
>> >                 id_news AND tipo =
>> >                 >         'img'
>> >                 >         >         >         >         GROUP BY
>> >                 >         >         >         >             news.id
>> >                 >         >         >         >         ORDER by
>> >                 >         >         >         >             fecha
>> >                 DESC,
>> >                 >         >         >         >             id DESC";
>> >                 >         >         >         >
>> >                 >         >         >         > Lo único es que me
>> >                 elige una imagen a
>> >                 >         criterio
>> >                 >         >         desconocido,
>> >                 >         >         >         pero me da
>> >                 >         >         >         > la impresión que es
>> >                 una con el id
>> >                 >         intermedio
>> >                 >         >         porque nunca es
>> >                 >         >         >         la mayor
>> >                 >         >         >         > ni la menor.
>> >                 >         >         >         >
>> >                 >         >         >         > 2010/9/30 Leonardo
>> >                 Tadei - Pegasus Tech
>> >                 >         Supply
>> >                 >         >         >         >
>> >                 <leonardot en pegasusnet.com.ar>
>> >                 >         >         >         >         Hola Carolina,
>> >                 >         >         >         >
>> >                 >         >         >         >         El jue,
>> >                 30-09-2010 a las 21:07
>> >                 >         -0300,
>> >                 >         >         Silverzero
>> >                 >         >         >         escribió:
>> >                 >         >         >         >         > Hola tengo
>> >                 un problema con una
>> >                 >         consulta
>> >                 >         >         a dos
>> >                 >         >         >         tablas (que
>> >                 >         >         >         >         seguro es
>> >                 >         >         >         >         > una pavada y
>> >                 yo no la veo), en
>> >                 >         una tengo
>> >                 >         >         noticias
>> >                 >         >         >         y en otra
>> >                 >         >         >         >         guardo
>> >                 >         >         >         >         > archivos,
>> >                 videos e imagenes de
>> >                 >         cada
>> >                 >         >         noticia, que
>> >                 >         >         >         pueden ser,
>> >                 >         >         >         >         ninguna o
>> >                 >         >         >         >         > más de una.
>> >                 >         >         >         >         > Cuando listo
>> >                 las noticias
>> >                 >         quiero que se
>> >                 >         >         vea UNA de
>> >                 >         >         >         las fotos
>> >                 >         >         >         >         (la de ID
>> >                 >         >         >         >         > menor),
>> >                 titulo, fecha,
>> >                 >         >         copete/desarrollo. Pero
>> >                 >         >         >         cuando una
>> >                 >         >         >         >         noticia
>> >                 >         >         >         >         > tiene más de
>> >                 una imagen me
>> >                 >         lista la
>> >                 >         >         noticia
>> >                 >         >         >         repetida tantas
>> >                 >         >         >         >         veces como
>> >                 >         >         >         >         > imágenes
>> >                 haya asociadas.
>> >                 >         >         >         >
>> >                 >         >         >         >
>> >                 >         >         >         >                Esto
>> >                 está bien, y es como
>> >                 >         se espera
>> >                 >         >         que
>> >                 >         >         >         funcione una
>> >                 >         >         >         >         query:
>> >                 creciendo
>> >                 >         >         >         >         "para abajo"
>> >                 con tantos
>> >                 >         registros como
>> >                 >         >         datos tenga
>> >                 >         >         >         la
>> >                 >         >         >         >         respuesta.
>> >                 >         >         >         >                Por lo
>> >                 que planteás, es
>> >                 >         como que
>> >                 >         >         esperás que
>> >                 >         >         >         la
>> >                 >         >         >         >         respuesta "se
>> >                 más
>> >                 >         >         >         >         ancha", es
>> >                 decir, tenga más
>> >                 >         columnas, pero
>> >                 >         >         nunca vas
>> >                 >         >         >         a tener
>> >                 >         >         >         >         más
>> >                 >         >         >         >         columnas que
>> >                 las que estés
>> >                 >         proyectando.
>> >                 >         >         >         >
>> >                 >         >         >         >                La
>> >                 solución a aplicar es
>> >                 >         >         programática: en la
>> >                 >         >         >         primer
>> >                 >         >         >         >         iteración de
>> >                 la
>> >                 >         >         >         >         query, rescatá
>> >                 los datos de
>> >                 >         News, y de la
>> >                 >         >         1ra y las
>> >                 >         >         >         >         siguientes,
>> >                 usá solo
>> >                 >         >         >         >         los datos
>> >                 proyectados de Data.
>> >                 >         >         >         >
>> >                 >         >         >         >
>> >                 >         >         >         >         > Mi consulta
>> >                 original es
>> >                 >         >         >         >         >
>> >                 >         >         >         >         >
>> >                 $qry="SELECT
>> >                 >         >         >         >         >
>> >                 news.id,
>> >                 >         >         >         >         >
>> >                 tit,
>> >                 >         >         >         >         >
>> >                 cop,
>> >                 >         >         >         >         >
>> >                 des,
>> >                 >         >         >         >         >
>> >                 fecha,
>> >                 >         >         >         >         >
>> >                 ruta as img
>> >                 >         >         >         >         >         FROM
>> >                 >         >         >         >         >
>> >                 news
>> >                 >         >         >         >         >         LEFT
>> >                 JOIN
>> >                 >         >         >         >         >
>> >                 data
>> >                 >         >         >         >         >         ON
>> >                 >         >         >         >         >
>> >                 news.id = id_news
>> >                 >         AND tipo =
>> >                 >         >         'img'
>> >                 >         >         >         >         >
>> >                 ORDER by
>> >                 >         >         >         >         >
>> >                 fecha DESC,
>> >                 >         >         >         >         >
>> >                 id DESC";
>> >                 >         >         >         >         >
>> >                 >         >         >         >         > Había
>> >                 probado hacer una
>> >                 >         consulta anidada
>> >                 >         >         en
>> >                 >         >         >         reemplazo de
>> >                 >         >         >         >         ruta as img,
>> >                 >         >         >         >         > por SELECT
>> >                 ruta FROM news,
>> >                 >         data WHERE
>> >                 >         >         news.id =
>> >                 >         >         >         id_news AND
>> >                 >         >         >         >         tipo =
>> >                 >         >         >         >         > 'img' LIMIT
>> >                 0,1, para que me
>> >                 >         devuelva
>> >                 >         >         una sola,
>> >                 >         >         >         pero se me
>> >                 >         >         >         >         repite la
>> >                 >         >         >         >         > misma imagen
>> >                 en cada
>> >                 >         noticia...
>> >                 >         >         >         >         >
>> >                 >         >         >         >         > Gracias
>> >                 >         >         >         >
>> >                 >         >         >         >
>> >                 >         >         >         >                Por
>> >                 nada!
>> >                 >         >         >         >                (si se
>> >                 entiende)
>> >                 >         >
>> >                 >         >         >
>> >                 >         >         --
>> >                 >         >
>> >                 >         >         Leonardo Tadei
>> >                 >         >         leonardot en pegasusnet.com.ar
>> >                 >         >         http://blog.pegasusnet.com.ar
>> >                 >         >         Firma pública:
>> >                 >         >
>> >                 >
>> >                 http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>> >                 >         >
>> >                 >         >
>> >                 _______________________________________________
>> >                 >         >         Php-avanzado mailing list
>> >                 >         >         Php-avanzado en pato2.fi.mdp.edu.ar
>> >                 >         >
>> >                 >
>> >
>> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>> >                 >         >
>> >                 >         >
>> >                 >         >
>> >                 >         >
>> >                 >         > --
>> >                 >         > Carolina Derromediz
>> >                 >         > Cel. +54 223 5301599
>> >                 >         >
>> >                 _______________________________________________
>> >                 >         > Php-avanzado mailing list
>> >                 >         > Php-avanzado en pato2.fi.mdp.edu.ar
>> >                 >         >
>> >                 >
>> >
>> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>> >                 >         --
>> >                 >
>> >                 >         Leonardo Tadei
>> >                 >         leonardot en pegasusnet.com.ar
>> >                 >         http://blog.pegasusnet.com.ar
>> >                 >         Firma pública:
>> >                 >
>> >                 http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>> >                 >
>> >                 >
>> >                 _______________________________________________
>> >                 >         Php-avanzado mailing list
>> >                 >         Php-avanzado en pato2.fi.mdp.edu.ar
>> >                 >
>> >
>> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>> >                 >
>> >                 >
>> >                 >
>> >                 >
>> >                 > --
>> >                 > Carolina Derromediz
>> >                 > Cel. +54 223 5301599
>> >                 > _______________________________________________
>> >                 > Php-avanzado mailing list
>> >                 > Php-avanzado en pato2.fi.mdp.edu.ar
>> >                 >
>> >
>> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>> >                 --
>> >
>> >
>> >                 Leonardo Tadei
>> >                 leonardot en pegasusnet.com.ar
>> >
>> >                 Pegasus Tech Supply
>> >                 Tel: (+54)(+223) 471-2880
>> >                 La Salle 1131 - Mar del Plata - Argentina
>> >                 http://www.pegasusnet.com.ar /
>> >                 http://blog.pegasusnet.com.ar
>> >                 http://www.prometeustech.com.ar /
>> >                 http://www.grupopegasus.com
>> >
>> >                 Firma pública:
>> >                 http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>> >
>> >
>> >                 _______________________________________________
>> >                 Php-avanzado mailing list
>> >                 Php-avanzado en pato2.fi.mdp.edu.ar
>> >
>> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>> >
>> >
>> >
>> >
>> >
>> >         --
>> >
>> >         Carolina Derromediz
>> >         Cel. +54 223 5301599
>> >
>> >
>> >
>> >
>> > --
>> > Carolina Derromediz
>> > Cel. +54 223 5301599
>> > _______________________________________________
>> > Php-avanzado mailing list
>> > Php-avanzado en pato2.fi.mdp.edu.ar
>> > http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>> --
>>
>> Leonardo Tadei
>> leonardot en pegasusnet.com.ar
>> http://blog.pegasusnet.com.ar
>> Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>>
>> _______________________________________________
>> Php-avanzado mailing list
>> Php-avanzado en pato2.fi.mdp.edu.ar
>> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>>
>
>
>
> --
> Carolina Derromediz
> Cel. +54 223 5301599
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>



-- 
Matias Fernando Gea
matigea en gmail.com
http://www.mfgea.com.ar
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://www3.fi.mdp.edu.ar/pipermail/php-avanzado/attachments/20101001/8660c809/attachment-0001.htm 


Más información sobre la lista de distribución Php-avanzado