En admettant que j'ai bien compris ce que tu demandes, je ne pense pas que ça sera plus rapide avec une requête unique.
En effet, ce que tu demandes ressemble à un produit cartésien.
Limiter aux offres concernant un seul produit serait peut-être plus simple.
Quitte à faire exécuter, par le code php, la requête pour chaque produit.
Tu es face à une problématique courante dans le client/serveur : quelle partie doit être traitée par l'appli, et quelle partie doit être traitée côté base de données ?
Néanmoins, voici une ébauche de requête (que je n'ai pu tester, étant au boulot *ahem*). Quand je serais de retour chez moi, je pourrais tester plus efficacement, car j'ai déjà une base contenant une table ressemblant énormément à la tienne.
Je vais d'ailleurs reprendre, dans mon exemple, les noms de champs de ma table à moi.
Soit la table traMarketOrders, contenant les champs orderID, typeID, volRemaining, price, bid.
orderID est l'identifiant de l'ordre de vente/achat, typeID est l'identifiant de l'objet vendu/recherché, volRemaining le nombre vendu/recherché, price le prix et bid un booléen indiquant s'il s'agit d'une vente (0) ou d'un achat (1).
Voici la requête que j'ai fait rapidement (c'est un produit cartésien, donc l'exécution risque d'être très très longue).
select
o1.orderID,
o2.orderID,
(o2.price - o1.price) * IF(o1.volRemaining > o2.volRemaining, o2.volRemaining, o1.volRemaining) AS iskGained
from traMarketOrders o1, traMarketOrders o2
where o1.bid = 0
and o2.bid = 1
Comme je n'ai pas pu la tester, cette requête est fournie telle qu'elle, sans aucune garantie.