No estás haciendo la consulta correctamente.
El SELECT debe definir QUE te muestra, y COMO te los muestra. SI lo que quieres es el menor precio de un producto, eso es el QUE. cuando pones HAVING le estás diciendo que tenga el menor ID (suponiendo que pro.id y pre.producto tienen el mismo dato), no el menor precio.
En estos casos no sirve poner SELECT * porque no puedes definir nada sobre ningún campo de la tabla y estás tratando de definir el menor. Hay que listar por nombre los campos que vas a visualizar.
Además SELECT * FROM es lo más ineficiente, porque te va a trae incluso datos que no vayas a usar, recargando la lectura inutilmente.
La cosa andaría (sin saber los nombres de los campos):
Código:
SELECT pri.id, pro.desc, pro.cant, MIN(pre.precio) precio
FROM Productos as pro INNER JOIN precios as pre ON pro.id = pre.producto
GROUP BY pri.id;