私は週末にこの問題を解決しようとしてきましたが、これまでのところ運がありません。私は2つのテーブルを持っています:
TopOffers:
OfferId RetailerId Order
1 38 0
2 8 3
3 17 2
4 22 1
とOffers:
Id RetailerId Name Description etc...
1 3 Strawberry Red and smelly
2 38 Cookie Crunchy
3 17 Onion Of the nice kind
4 22 Apple Cheap
5 8 Toothbrush Lasts extra long!
私の目標は、小売業者 ID ごとに上位 10 個のオファーを取得することです。それらがリストされるOrder
順序は、TopOffer テーブルのフィールドによって指定されます (並べ替え順序は昇順です)。その上、小売業者の TopOffer レコードが 10 未満の場合、結果は 10 個のオファーにパディングされる必要があります。TopOffer テーブルには、小売業者ごとに常に 10 以下のレコードが含まれます。
これまでのところ、うまくいきました (TopOffer テーブルは常に任意の小売業者のトップ 10):
SELECT b.*
FROM
(
SELECT o.Id, to.`Order` FROM Offer AS o
LEFT JOIN TopOffer AS to
ON o.Id = to.OfferId
) AS a,
(
SELECT o.*, to.`Order` FROM Offer AS o
LEFT JOIN TopOffer AS to
ON o.Id = to.OfferId
) AS b
WHERE a.`Order` >= b.`Order` AND a.Id = b.Id
GROUP BY b.RetailerId, b.Id
HAVING Count(1) BETWEEN 1 AND 10
ORDER BY RetailerId, `Order` ASC
残念ながら、その小売業者の TopOffer レコードが 10 個ない場合、TopOffer テーブルにエントリがないオファーでこのクエリの結果をパディングする方法が見つからないようです。
助けてくれてありがとう!