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

select doble (right join)

Estas en el tema de select doble (right join) en el foro de Bases de Datos General en Foros del Web. Hola buenas veran tengo la siguietne duda veran utilizo un select para sacar lso datos de las noticias y dentro de ese buqule ago otro ...
  #1 (permalink)  
Antiguo 02/03/2009, 12:05
 
Fecha de Ingreso: mayo-2007
Mensajes: 51
Antigüedad: 16 años, 11 meses
Puntos: 0
select doble (right join)

Hola buenas veran tengo la siguietne duda veran utilizo un select para sacar lso datos de las noticias y dentro de ese buqule ago otro select simplemente para sacar el nombre del usuario comparando el id del usuario que pone la noticia con el id del usuario en el foro me e decidido a mejorar esta consulta ya que asi esta bastante mal y no agoa mas que perder tiempo cada ves que el buqle se repite ya uqe hace todo el rato consultas asi que me decidi a hacer un right join i left join pal caso es lo mismo pero tardan las dos el mismo tiempo en cargar osea cuando pongo el right join asi como ven abajo la consulta tarda una barbaridad
SELECT columna1
FROM basedatosweb.articulos art
RIGHT JOIN basedatosforo.phpbb_users foro ON foro.username=art.c_alias
where art.c_categoria In ('Anime', 'Manga') and art.c_publicado='si'
ORDER BY art.c_id DESC limit 15

una barbaridad me refiero a mas de 4 segundos, y si le quito el where aun tarda mas de 10 o 11 segundos en hacerse la consulta posibles maneras tengo de ahcerlo para optimizar esta consulta o no ahi manera posible o que de que jeje.

saludos y gracais de antemano
  #2 (permalink)  
Antiguo 02/03/2009, 12:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: select doble (right join)

A ver si esto te sirve
No debes hacer un left join general, sino sólo de lo que encuentres. Incluso podrías probar cambiando el orden de la consulta dentro de paréntesis para ver cuál es más rápida.
Si columna1 es de la tabla phpbb_users estaría bien; si es de la tabla art, debes escribirlo t1.columna1 en el select primero

SELECT foro.columna1, t1.c_alias, t1.c_id FROM basedatosforo.phpbb_users foro LEFT JOIN (SELECT art.c_alias, art.c_id FROM basedatosweb.articulos art where art.c_categoria In ('Anime', 'Manga') and art.c_publicado='si')t1 ON foro.username=t1.c_alias ORDER BY t1.c_id DESC
  #3 (permalink)  
Antiguo 02/03/2009, 14:15
 
Fecha de Ingreso: mayo-2007
Mensajes: 51
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: select doble (right join)

osea que el orden en que haces select foro.clumna tambien influye en la rapides de procesamiento... podrias explicarme en que columnas poner antes de caules.

porcierto se a mejorado la consulta en un segundo, pero aun asi sigue siendo muy lenta como mucho deveria tardar 1.5 segundos ;D.

saludos ;d. y gracias de antemano
  #4 (permalink)  
Antiguo 02/03/2009, 14:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: select doble (right join)

Me refería a esto:
where art.c_categoria In ('Anime', 'Manga') and art.c_publicado='si'
o
where art.c_publicado='si' and art.c_categoria In ('Anime', 'Manga')

Comprueba cuánto tarda en realizar esta consulta:
SELECT art.c_alias, art.c_id FROM basedatosweb.articulos art where art.c_categoria In ('Anime', 'Manga') and art.c_publicado='si'

y esta otra

SELECT art.c_alias, art.c_id FROM basedatosweb.articulos art where art.c_publicado='si' and art.c_categoria In ('Anime', 'Manga')

Habría que ver qué índices tienes, si las categorías las tienes en campos indexados, deberías utilizarlos (aunque si no son muchas, lo mismo no sirve de nada)

también deberías hacer un explain a la consulta para ver el rendimiento de la misma.
Por otra parte, no sé si el order by por t1.c_id es necesario. No olvides que estás mostrando todos los datos de la tabla phpbb_users, no sé muy bien por qué; y si los muestras todos, por qué ordenar con un criterio que no tendrán todos los registros. Yo lo quitaría y comprobaría también la diferencia.
De todas formas, quizás lo mejor sería que nos dijeras la lógica de la consulta, por si hubiera una mejor solución para tu caso.
  #5 (permalink)  
Antiguo 02/03/2009, 14:57
 
Fecha de Ingreso: mayo-2007
Mensajes: 51
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: select doble (right join)

buneo creo que en un punto no coincido contigo cunado dices que selecciono todos tampoco ahi otra manera de hacerlo o si osea lo unico que queiro es comparar la tabla c_alias con username para saver el id del usuario es lo unico esa comparacion no tiene que determinar nada mas ni selecionar ningun dato diferente osea lo que ago es mostrar unas noticias que estan la tabla articulos de las cuales selecciono el cuerpo del articulo el titulo nada mas y para saver que campos coger utilizo where para seleccionar solo aquellos que sean de anime y que esten validados osea que publciado sea si, entocnes la comparacion del c_alias con la columna del foro es simplemente para sacar el id del usuario para nada mas me parece que la consulta es mas eficiente si esta anidada osea un select dentro del while del otro o eso me aprece si me equiboco dime que forma ven mejor para optimizar la maximo esta consulta.

saludos

pd: que otra forma tengo para sacar el dato del id_user que no sea left join ya que inner join lo que aria seria agregar mas clausular where con esto me refiero que ahces una seleccion del dato no un consulta sobre un dato que queires recojer.

sakludos ;D.
  #6 (permalink)  
Antiguo 02/03/2009, 15:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: select doble (right join)

Dinos la estructura de las tablas implicadas y qué quieres mostrar exactamente de cada una de ellas. Buscaremos otra solución, porque el problema debe ser en parte el LEFT JOIN que quizás no sea necesario.
  #7 (permalink)  
Antiguo 02/03/2009, 17:47
 
Fecha de Ingreso: mayo-2007
Mensajes: 51
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: select doble (right join)

bamos a ver la estructura de la tabla de articulos es la sigueinte tiene un campo numerico = id no es autoincrement y es smallint(5) la tabla no tiene indices sigo ocn la estructura titulo campo text alias campo varchar(50) publicado varchar(2)
articulo y leermas campos text categoria campo varchar(20) y hora campo datetime

nose cuanto se peuda mejorar la consulta la verdad es que sin left join no se me ocurre otra dia ma que meter la consutla dentro del while del select que se le ahce al atacar la tabla de articulos ya que asi solo estas coji9enod un campo bueno aver que sugieren jeej salduos ;d bueno el campo del foro supongo que sabran cual es no jeje es un phpbb saludos :D.

PD: jejej me e sorprendido umm como decir malamente al ver una optimizacion que estaba intentando hacer utilizando el explain resulta que explain me iba diciendo que cada ves seleccionaba mejor los datos porque le ponia dos indices que son lso que utilizaba para cogerla informacion yresulkta que la consutla tarda bastante mas que si no le pongo esos indices de mas a la tabla jeje no aver si me lo explciais jeje

pd2:otra preguntita mas que me surge, aver que es mejor hacer esto select * from tabla
while($array=mysq_fet...)
{
seleect * from tabla2 comparo datos de esta tabla con lso de la tabla 1
}

o en ves de hacer eso es mejor hacer un inner join... estoy en duda ya que bueno quizas el bucle te ahce hacer todo el rato una consulta y se pueda ver como un exceso de consultas hacia la base de datos pero la velocidad es superior o como que me sugieren sobre esto aver que me pueden decir ;d.

Última edición por ddanime; 02/03/2009 a las 18:37
  #8 (permalink)  
Antiguo 03/03/2009, 01:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: select doble (right join)

SELECT columna1
FROM basedatosweb.articulos art
INNER JOIN basedatosforo.phpbb_users foro ON foro.username=art.c_alias
where art.c_categoria In ('Anime', 'Manga') and art.c_publicado='si'
ORDER BY art.c_id DESC limit 15

Esto debería funcionar, pues todas las noticias tendrán un autor en su tabla, es decir un c_alias que estará en la tabla de usuarios del foro. Tal vez el problema está en que no tengas indexado ese c_alias. Indéxalo y también debería estar indexado username para poder hacer esto más rápido. En cuanto al índice sobre c_publicado, no interesa, pues la cardinalidad será 2 o 3 si o no, o si/no/null y tardará más que si no tienes índice porque primero irá a comprobar si puede utilizar los índices, verá que no, y tendrá que hacer lo que de todas maneras tendría que hacer. Lo mismo tal vez puede decirse sobre c_categoria.
Creo que de esta manera encontrarás lo que quieres y rápido, aunque, como te digo, los campos username y c_alias deben estar indexados y funcionando el índice. No sé qué gestor de bases de datos usas y no puedo decirte mucho más. No tiene sentido, creo, usar un left join, puesto que no quieres que aparezcan los usuarios que no tengan noticia... o las noticias que no tengan usuario (no habrá ningún caso).
  #9 (permalink)  
Antiguo 03/03/2009, 11:16
 
Fecha de Ingreso: mayo-2007
Mensajes: 51
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: select doble (right join)

hola jurena que tal te comento la consutla tarda esactamente 4 segundos en realizarse e estado haciendo pruebas y si quito el order by la sentencia dura 0.009 osea esa cifra ya esta bien pero con el order by tarda mucho que puede pasar.

saludos ;d.
  #10 (permalink)  
Antiguo 03/03/2009, 13:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: select doble (right join)

¿A qué consulta te refieres, pues hemos propuesto varias? De todas maneras si no indicas un orden por id, te sacará, creo, el orden por id, dado que es el orden en que están almacenados los datos y son recorridos. Quíta el orden y dinos si es así.
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 11:03.