[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