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

Duda subconsulta y order by

Estas en el tema de Duda subconsulta y order by en el foro de Mysql en Foros del Web. Bueno el otro dia descrubir el maravilloso mundo de las subconsultas, pero ahora me han traido un quebradero que no alcanzo a comprender, haber si ...
  #1 (permalink)  
Antiguo 21/09/2010, 03:47
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Duda subconsulta y order by

Bueno el otro dia descrubir el maravilloso mundo de las subconsultas, pero ahora me han traido un quebradero que no alcanzo a comprender, haber si los que ya la habeis experimentado, me podeis orientar un poco.

La consulta es esta (sacada desde un echo para no tener que incluir toda la programacion, ya que la variable es para un buscador, y tiene muchos campos opcionales)

Código PHP:
SELECT inmuebles.modo_inmuebleinmuebles.superficie_construida_inmuebleinmuebles.dormitorios_inmuebleinmuebles.post_precioinmuebles.id_inmuebleinmuebles.nombre_inmuebleinmuebles.descripcion_inmueble,

(
select inmuebles_fotos.foto_inmueble from inmuebles_fotos where inmuebles_fotos.id_inmueble=inmuebles.id_inmueble ORDER BY inmuebles_fotos.foto_principal ASC LIMIT 0,1) as foto_inmueble

inmuebles_subtipos.nombre_inmueble_subtipo1paises.nombre_paisprovincias.nombre_provinciaareas.nombre_area FROM inmuebles INNER JOIN inmuebles_subtipos ON (inmuebles.id_inmueble_subtipo inmuebles_subtipos.id_inmueble_subtipoINNER JOIN paises ON (inmuebles.id_pais paises.id_paisINNER JOIN provincias ON (inmuebles.id_provincia provincias.id_provinciaINNER JOIN areas ON (inmuebles.id_area areas.id_areaWHERE inmuebles.estado_inmueble 'visible' AND inmuebles.validacion 'si' 

ORDER BY  foto_inmueble DESCinmuebles.post_precio ASC 
intento algo tan simple como ordenar por fotos (los inmuebles con fotos primero, y los que no tienen despues) y precio (los mas baratos primero y los mas caros despues).

Hasta antes de integrar la subconsulta (que me ayuda a sacar la foto principal de cada innmueble) la respuesta venia ordenada, como queria. pero despues de añadirla no lo hace, ordenas por fotos, eso si, pero no por precio, aunque me di cuenta tras las pruebas, de que los inmuebles que no tienen fotos, si se ordenan por precio.

Por probar probe tambien a intentar ordenarlo en la subconsulta, pero el resultado seguia siendo el mismo.

Despues de mucho googlear, toda la informacion que encontre, era lo que ya sabia y lo que deberia ser (al especificar dos campos, deberia ordenarlo sin mas), tambien encontre algo referente al uso de comillas, para las alias, pero como no uso las comillas, tampoco deberia ser ese problema. (segun entendi, no se puede usar comillas en el orden by, pues si no no reconoces el alias como tal).

¿Alguien se le ocurre, como podria ordenarlo?¿hay que especificar de alguna forma especial que el campo a ordenar, es un alias?

Gracias de antemano.
  #2 (permalink)  
Antiguo 21/09/2010, 03:56
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Duda subconsulta y order by

Prueba a dejar el ultimo order by solo asi:

ORDER BY inmuebles.post_precio ASC


Porque tenias puesto que una vez sacas los inmuebles con su foto principal, las ordenara de nuevo por foto en vez del precio
  #3 (permalink)  
Antiguo 21/09/2010, 04:07
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: Duda subconsulta y order by

Eso ya lo probe, y si quito que ordene por fotos, si se ordena por precios, pero la fotos aparecen segun la presencia en base de datos (por lo que no ordena por fotos, y los inmuebles con fotos y sin fotos se entremezclan).

La subconsulta, lo que me trae la foto principal, pero no me ordena por fotos (ordena las fotos interna de cada inmueble, no el resultado devuelto)


Lo que quiero consegir es que se orden las dos cosas.
Con fotos -> de mayor a menor precio.
Sin foto -> de mayor a menor precio

La cosa es que antes me funcionaba (aqui esta la version colgada, sin actualizar aun con la subconsulta http://www.posttigo.com/index.php?bus=0), Pero desde que añadi la subconsulta para obtener las fotos principales es donde tengo el problema.

Gracias por el interes
  #4 (permalink)  
Antiguo 21/09/2010, 04:46
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 8 meses
Puntos: 150
Respuesta: Duda subconsulta y order by

¿y asi?

ORDER BY LENGTH(foto_inmueble)>0 DESC, inmuebles.post_precio ASC

Necesitamos que valore cualquier imagen con foto con el mismo valor, y con el LENGTH(foto_inmueble)>0 logramos que los que tengan foto devuelva 1 y los que no tengan devuelva 0, de modo que luego asi agrupados pase al secundo criterio inmuebles.post_precio ASC

Creo que usar esta funcion es una chapuza, debe haber otra funcion para "agrupar" de esta manera los registros que tengan texto o sean NULL... A ver si alguien más nos ayuda a los dos jeje
  #5 (permalink)  
Antiguo 21/09/2010, 04:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
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)
  #6 (permalink)  
Antiguo 22/09/2010, 01:38
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: Duda subconsulta y order by

Muchas gracias por vuestra ayuda.

Decir que la solucion de Vun, maravillosa, todo funciona correctamente y ordena bien, (fotos y precios). Muchas gracias por tu ayuda

Por otro lado, me parece muy interesante lo que me cuentas gnzsoloyo, como decia al comienzo del post, hace poco descubri las subconsultas (Gracias al amigo Vun), pero he intentado llevar tu propuesta acabo y me encuentro con varios problemas, el primero que me salia era, que en la subconsulta debia obtener tambien el id_inmueble de la tabla de las fotos, si no me arrojaba "Unknown column 'F.id_inmueble' in 'on clause' " lo soluciones, asi:

Código PHP:
SELECT inmuebles_fotos.foto_inmueble inmuebles_fotos.id_inmueble
FROM inmuebles_fotos
ORDER BY inmuebles_fotos
.foto_principal ASC LIMIT 0,1F ON I.id_inmueble F.id_inmueble 

al probarlo, solo el primer registro mostrado tenia fotos, el resto no me devuelve nada.
  #7 (permalink)  
Antiguo 22/09/2010, 03:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda subconsulta y order by

Eso significa simplemente que hay que afinar la consulta.
Muchas veces cuando posteas una duda que abarca varias tablas es muy conveniente postear también la estructura de las tablas para que nosotros podamos ver bien las relaciones y de esa forma hacer una rpopuesta que pueda funcionar.
En general yo sólo me remití a tratar de hacer que el LEFT JOIN se vinculara con las restantes de una forma que parecía coherente conforme lo que habías mostrado. Obviamente me faltaban algunos detalles.

De todos modos yo supongo que debe poderse hacer de ese modo, pero hay que afinarla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 22/09/2010, 04:14
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: Duda subconsulta y order by

Bueno no te preocupes, poner todo el contenido seria demasiado extento, y tampoco pretendo que me hagais el trabajo, solo que me hecheis un cable :)

por ahora puedo salir del paso con lo que vimos hasta ahora,y he probado la forma que me comentaste en otras consultas y se nota, en comodidad y eficacia, como dices sera afinar para este caso concreto, le dare caña al tema este, hasta poder controlarlo mejor.

Mucha gracias

Etiquetas: order, subconsulta
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 20:22.