По каждому товару находите shop_id и price для тех магазинов, где есть достаточное количество товара, затем находите пересечение (JOIN) этих магазинов. Получившуюся таблицу сортируете по стоимости. Так как число товаров может быть разным, то запрос надо строить каждый раз из фрагментов. В результате должно получиться что-то вроде
SELECT `s`.`id`, `s`.`name`
FROM `shops` AS `s`
JOIN `residues` AS `r1`
ON `r1`.`shop_id` = `s`.`id` AND `r1`.`good_id` = 1 AND `r1`.`quantity` >= 2
JOIN `residues` AS `r2`
ON `r2`.`shop_id` = `s`.`id` AND `r2`.`good_id` = 5 AND `r2`.`quantity` >= 1
ORDER BY `r1`.`price`*2+`r2`.`price*1