¿MySQL es lo suficientemente inteligente como para no volver a consultar la fecha máxima para cada elemento?

Tengo una consulta que hace una combinación como esta:

LEFT JOIN history ON history.item_id=item.id AND history.date=(SELECT MAX(date) FROM history WHERE item_id=item.id)

¿MySQL es lo suficientemente inteligente como para ejecutar SELECT MAX... subconsulta solo una vez?


Edit: Lo siento, debería haber mencionado el WHERE en general SELECT especifica un ID de artículo singular:

WHERE item.id=XXX

preguntado el 16 de mayo de 11 a las 16:05

Almacenaría en caché la consulta, pero dado que la subconsulta depende de los valores en la consulta principal, lo más probable es que obtenga un nuevo escaneo MAX () cada vez, ya que el item_id habrá cambiado para cada invocación de subconsulta. -

@Marc: Ups ... debería haber mencionado que el SELECT general especifica un item_id, por lo que no es diferente para cada subconsulta. De hecho ... espera. Creo que arruiné toda esta pregunta. El punto es, sin embargo, que las condiciones serían las mismas para cada fila; de lo contrario, esta pregunta no tendría sentido. No se puede almacenar en caché si los valores eran diferentes. -

2 Respuestas

Respuesta corta: NO.

La mejor práctica es utilizar variables

SELECT @maxDate:= MAX(date) FROM history WHERE item_id=item.id

y luego usar la variable @maxDate en sus consultas.

contestado el 16 de mayo de 11 a las 20:05

Podría estar fuera de tema, pero ¿PHP es compatible con esto? Si ejecuto esto primero en uno mysql_query ¿Puedo usar esa variable en una consulta posterior? En realidad, ni siquiera importa, porque podría usar variables PHP en su lugar ... - mpen

@Mark No tanto en php ... pero supongo que estas variables tienen un ciclo de vida de la conexión ... así que mientras lo hagas en la misma conexión, estarás seguro (probablemente) - Jai

@Mark: Sí, puede, pero debe hacerse a través del mismo identificador de conexión en PHP, ya que son por conexión, no por usuario. - Marc B

Do explain plan luego la consulta y ver

Voy a decir No porque esta es una "subconsulta correlacionada"

ver : http://blog.sqlauthority.com/2007/09/07/sql-server-correlated-and-noncorrelated-subquery-introduction-explanation-and-example/

Sé que el DBMS en el blog es MSSQL pero se aplica el mismo principio

contestado el 16 de mayo de 11 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.