Foros del Web » Programando para Internet » PHP »

optimizar consulta

Estas en el tema de optimizar consulta en el foro de PHP en Foros del Web. hola a todos, tengo una duda que comparto con ustedes en búsqueda de una ayuda. resulta que tenemos una base de datos (mysql), donde guardamos ...
  #1 (permalink)  
Antiguo 24/08/2011, 18:40
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 9 años, 1 mes
Puntos: 209
optimizar consulta

hola a todos, tengo una duda que comparto con ustedes en búsqueda de una ayuda.
resulta que tenemos una base de datos (mysql), donde guardamos informes y cada informe tiene una, ninguna o varias propuestas de mejoras, por lo que se me ocurrió esta estructura

id | idPrev | titulo | etc etc (no los abrumo con los demás campos)

siendo id el id del informe, idPrev es el id del informe al que se le hace la propuesta, por tanto un informe inicial sería

id | idPrev (por lo que cada informe inicial tendrá como idPrev 0)
1 0

y una propuesta de cambio a ese informe sería

id | idPrev
2 1

quisiera hacer un listado decreciente de los informes que más propuestas tienen ...

alguna idea que no sea

1- recorrer todas las tuplas de la tabla y dentro de ese ciclo ir haciendo otra consulta buscando su id en los idPrev de toda la tabla, eso me parece muyyyy lento, alguna ayuda ?
__________________
aconcaguaestudio.com
  #2 (permalink)  
Antiguo 24/08/2011, 19:05
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 1 mes
Puntos: 845
Respuesta: optimizar consulta

Estas guardando los informes y las mejoras en la misma tabla ?, en caso afirmativo un self join + group by debería ser suficiente.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 24/08/2011, 19:20
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 9 años, 1 mes
Puntos: 209
Respuesta: optimizar consulta

hola, si todo se guarda en la misma tabla, aca hice una consulta

Código PHP:
select idPrevcount(*)
from tabla
where idPrev 
-- si quieres sacar sólo informes con revisiones
group by idPrev
order by 2 desc 
y funciona, pero si la que tiene los mejoras es la que tiene la primera, no me parece que funciona bien
__________________
aconcaguaestudio.com
  #4 (permalink)  
Antiguo 24/08/2011, 19:33
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 1 mes
Puntos: 845
Respuesta: optimizar consulta

Me refiero a algo así:

Código SQL:
Ver original
  1. SELECT t1.id, COUNT(t1.id) AS total
  2. FROM tabla t1
  3. LEFT JOIN tabla t2 ON(t1.id = t2.parent)
  4. GROUP BY t1.id
  5. ORDER BY total DESC

Nota: parent seria tu idPrev
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 24/08/2011, 19:37
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 9 años, 1 mes
Puntos: 209
Respuesta: optimizar consulta

perfecto !!!!!!!!!!!!!!!!!!!!....
y yo que pensaba en metodos recursivos, o cualquier otra cantidad de métodos costosos, gracias miles @masterpuppet
__________________
aconcaguaestudio.com
  #6 (permalink)  
Antiguo 24/08/2011, 21:21
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 9 años, 1 mes
Puntos: 209
Respuesta: optimizar consulta

me daba falsos positivos, probé cambiando el left join por un rigth join, solo ese cambio y me funciona bien, solo que al fina me pone
id | total
null | 0

ese ultimo valor, no se pq me sale, los demás si me salen bien, alguna idea ???
__________________
aconcaguaestudio.com
  #7 (permalink)  
Antiguo 25/08/2011, 04:29
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 12 años, 1 mes
Puntos: 845
Respuesta: optimizar consulta

Si es por el LEFT JOIN, my bad sry, algo asi deberia tirar bien:

Código SQL:
Ver original
  1. SELECT t1.id, COUNT(t1.id) AS total
  2. FROM tabla t1,tabla t2
  3. WHERE t1.id = t2.parent
  4. GROUP BY t1.id
  5. ORDER BY total DESC

Prueba y me comentas.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #8 (permalink)  
Antiguo 25/08/2011, 05:06
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 9 años, 1 mes
Puntos: 209
Respuesta: optimizar consulta

funciona bien, gracias @masterpuppet, me podrías orientas de donde leer sobre estas consultas avanzadas (al menos para mi)
__________________
aconcaguaestudio.com
  #9 (permalink)  
Antiguo 25/08/2011, 05:13
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 11 años, 11 meses
Puntos: 253
Respuesta: optimizar consulta

La única forma de controlar sentencias más grandes o complejas es la práctica. Tienes que tener bien asimilado qué opciones tienes y cómo funcionan. Luego es cuestión de verlo o no verlo.

Mi recomendación es que no te mires un manual complejo, sino que mires uno simple a conciencia. No necesitas que un manual te diga cómo juntar un GROUP BY con un INNER JOIN y un DISCTINT en la misma consulta. Lo que necesitas es tener muy claro el GROUP BY, muy claro el INNER JOIN, muy claro el DISCTINT y saber cómo aplicarlos. Las sentencias complejas luego te vienen solas.

Es mi consejo, un saludo.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?
  #10 (permalink)  
Antiguo 25/08/2011, 05:44
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 9 años, 1 mes
Puntos: 209
Respuesta: optimizar consulta

te agradezco, tienes toda la razón
__________________
aconcaguaestudio.com

Etiquetas: mysql, tabla
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 10:35.