1

私は週末にこの問題を解決しようとしてきましたが、これまでのところ運がありません。私は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 テーブルにエントリがないオファーでこのクエリの結果をパディングする方法が見つからないようです。

助けてくれてありがとう!

4

1 に答える 1

0

1 ~ 10 の数字で仮想テーブルを作成する場合、結果に左結合してそれぞれ 10 個を取得できます

   select number, results.*
   from
       (select 1 as number union select 2 union select 3 ... union select 10) numbers
            left join
       (your query here) results
            on numbers.number = results.rank
于 2012-10-29T14:17:17.060 に答える