Cita: Bueno no entiendo mucho, lo que crei entender era que el problema a cual se debia el error era por LAST_INSERT_ID() porque toma el ultimo valor de una tabla autoincrement, sin distinguir entre ellas, entonces suponiendo que si tengo dos tablas autoincrement y una es mas baja que la otra y quiero el valor de la mas baja, no me conbiene. Por eso hize esta consulta que hace li mismo:
SET idVenta = (SELECT Idventas FROM ventas ORDER BY Idventas desc LIMIT 1);-
En esto hay que atenerse a lo que los manuales explican: LAST_ISERT_ID() Devuelve el ID autoincremental que se ingresó en la última sentencia de inserción. Si se trató de de una inserción múltiple, sólo devuelve el valor de la primera inserción y no la última.
Se trata de una función muy eficiente, y que es mucho mejor que el ejemplo que das, porque en tu ejemplo, para encontrar ese valor
debe leerse toda la tabla y ordenarse en forma decreciente . Te comento que el
ordenamiento es una de las operaciones de mayor consumo de recursos en una base de datos, luego de los productos cartesianos.
Además, piénsalo así: ¿Para qué hacer una lectura de tabla, si una función me devuelve el valor buscado?
Lo que debes recordar es que ese valor no es permanente: Cambia con la siguiente inserción, por lo que la toma del dato debe ser inmediata a la ejecución (por eso la cambié de lugar).
Cita: Bien en cuanto a la sita no entiendo muy bien, porque si yo llamo a la misma funcion tal cual la tengo desde el query browser de mysql me funciona a la perfeccion, el problema radica al llamarlo desde php.
Esto me parece que no lo habías mencionado, y es el corazón de tu problema.
Te has encontrado con un BUG de PHP (ver:
Bug #42548. PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!))
Aparentemente podría resolverse usando PHP 5.2.3, o cualquier versión de PHP posterior al 01/01/2008.
El problema se originaría porque un SP que retorne un set (tabla) es tomado por PHP como un
multi_query, por lo que no puede ejecutarlo dada la configuración que el servidor de PHP tiene.
¿Solución? Saca el SELECT fuera del SP y ejecútalo con otra consulta a continuación (la simpleza por sobre todo).
Cita: y no entiendo mas cuando dice esto: Esto incluye comandos SELECT que no usan INTO hasta ahora no e usado select con un into dentro. ¿A que se refiere?
A que la forma eficiente y estandarizada de poner valores obtenidos en un select dentro de variables es usando la cláusula INTO, tal y como te lo puse en el ejemplo:
Tip final: El uso de una función MAX() es más eficiente que lo que haces tu, pero menos que usar simplemente LAST_INSERT_ID().