Ver Mensaje Individual
  #5 (permalink)  
Antiguo 21/09/2010, 04:58
Avatar de gnzsoloyo
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: Duda subconsulta y order by

Poner una subconsulta dentro del SELECT no es una buena idea. En general es algo que hay que evitar hacer porque cualquier subconsulta puesta allí se ejecuta una vez por cada registro obtenido de la consulta principal.
Eso quiere decir que si la consulta devuelve 1200 registros, la subconsulta se ejecutará 1200 veces...
Huelga decir lo que eso le hace a la performance.
En tu caso es más simple crear la subconsulta en el FROM, donde se ejecutará una sola vez. Pero uno de los problemas que tienes es que existe la posibilidad de que el resultado de la consulta sea NULL, y es imposible ordenar un NULL como primer campo y hace que el resultado sea al menos errático.
No es una buena elección de orden. El ordenamiento es preferible hacerlo sobre la base de campos que estés seguro de que existan, tales como la ciudad, barrio, calle, precio pedido, categorizaciones. Pero no en base a un campo que puede terminar siendo NULL.
En este punto lo más que puedes hacer es controlar los NULL, pero a menos que rediseñes la tabla resultado a mostrar, el problema subsistirá, solo que más controlado.
Una idea:
Código MySQL:
Ver original
  1.   I.modo_inmueble,
  2.   I.superficie_construida_inmueble,
  3.   I.dormitorios_inmueble,
  4.   I.post_precio,
  5.   I.id_inmueble,
  6.   I.nombre_inmueble,
  7.   I.descripcion_inmueble,
  8.   IFNULL(foto_inmueble, '') foto_inmueble
  9.   ISB.nombre_inmueble_subtipo1,
  10.   P.nombre_pais,
  11.   PR.nombre_provincia,
  12.   A.nombre_area
  13.   inmuebles I INNER JOIN
  14.   inmuebles_subtipos ISB ON I.id_inmueble_subtipo = ISB.id_inmueble_subtipo INNER JOIN
  15.   paises P ON I.id_pais = P.id_pais INNER JOIN
  16.   provincias PR ON I.id_provincia = PR.id_provincia INNER JOIN
  17.   areas A ON I.id_area = A.id_area LEFT JOIN
  18.   (SELECT inmuebles_fotos.foto_inmueble
  19.   FROM inmuebles_fotos
  20.   ORDER BY inmuebles_fotos.foto_principal ASC LIMIT 0,1) F ON I.id_inmueble = F.id_inmueble
  21.   I.estado_inmueble = 'visible' AND
  22.   I.validacion = 'si'
  23. ORDER BY foto_inmueble DESC, inmuebles.post_precio ASC;

Consejos:
- Trata de usar nombres más cortos en los nombres. Evitarás problemas para tipearlos.
- Procura estructurar la sentencia de modo que sea fácil de leer.
- Usa alias cortos para las tablas. Cuando son demasiado largos cuesta leer el conjunto.
- No pongas subconsultas en el SELECT si puedes evitarlo.
- Controla la salida de NULLs. Luego te traen problemas al tomar la tabla resultado en programación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)