Ver Mensaje Individual
  #4 (permalink)  
Antiguo 15/12/2015, 13:23
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: 16 años, 5 meses
Puntos: 2658
Respuesta: JOIN con preferencia

Por lo pronto, un par de cosas:

1) MySQL no tiene tipos de dato TABLE, LIST, o RECORDSET, y los SET y ENUM sólo aplican a tablas, y no a SP. Con esto quiero decir que no puedes pasar una lista de valores, ni recibir en un parámetro de salida (OUT) y set de datos. SOlo datos únicos.
2) Un SP puede devolver una tabla resultado, pero no como parámetro, sino como salida de la ejecución. Para recuperarla dependerá del lenguaje de programación usado (OFF TOPIC en este foro).
3) El que uses una tabla en un JOIN en una consulta de una parte del SP, no implica que las siguientes consultas puedan adivinar que vas a volver a usar la tabla. Cada vez que haces un SELECT con dos o más tablas, en el FROM de CADA UNO, se debe n indicar las tablas implicadas, y tu estás omitiendo una tabla en las dos consultas finales.

A nivel de programación de SP, lo más simple, si vas a hacer una cosa u otra dependiendo de la existencia de un dato, es simplemente validar primero ese dato e una condición TRUEJ/FALSE, y no recopilar el dato respuesta al principio. Consumirás menos recursos y la lógica será más simple.

Para tu caso lo que necesitas es sólo el ID del supermercado que buscas, le resto sería lógica:
Código MySQL:
Ver original
  1. CREATE PROCEDURE ListaPrecios(IN idSuper INT, IN idProducto INT)
  2.     DECLARE existe DEFAULT '0';
  3.  
  4.     SELECT COUNT(1)
  5.     FROM ists_prods LP
  6.     WHERE P.ID = idProducto
  7.     INTO existe;
  8.    
  9.     IF existe ¡= 0 THEN
  10.         -- Existe el producto al menos en un super.
  11.         SET existe = 0;
  12.         SELECT COUNT(1)
  13.         FROM supermercados_productos SP
  14.         WHERE superID = idSuper AND productoID = IdProducto
  15.         INTO existe;
  16.         IF existe ¡= 0 THEN
  17.             SELECT SP.*
  18.             FROM supermercados_productos
  19.             WHERE cod = idProducto AND supermercadoID = SUperID;
  20.         ELSE
  21.             SELECT SP.*
  22.             FROM supermercados_productos
  23.             WHERE cod = idProducto AND supermercadoID ¡= SUperID
  24.             ORDER BY RND()
  25.             LIMIT 1;
  26.          END IF;
  27.     ELSE
  28.         SELECT -1 error, 'NO existe l producto' Msj;
  29.     END IF;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)