各ストアからの最初の 3 件の購入までの、各ストアからの購入概要をユーザーに表示したいと考えています。
わかりやすくするために、購入数は構成できません。つまり、最初の N ではなく、最初の 3 です。
これらの列を含むテーブルがあるとします
Store
id
name
Product
id
name
storeId
price
Purchase
id
userId
productId
count
purchaseTime
これが表示したいものです
------------------------
-----------
| store | product | count | price |
------------------------
-----------
| disney | stitch doll | 1 | 30 |
| | donald cap | 3 | 15 |
| | ticket | 2 | 100 |
------------------------
-----------
| universal | iron man figure | 1 | 100 |
| | batman figure | 1 | 90 |
------------------------
-----------
できれば、ユーザーがドナルド キャップを 2 回に分けて購入した場合 (価格は変わらないと想定)、購入数は結合されます。
例: ユーザーがドナルド キャップ 2 個を購入し、次にキャップ 1 個を購入した場合、結果はドナルド キャップ 2 個とドナルド キャップ 2 個ではなく、ドナルド キャップ 3 個になります。ドナルドキャップ 1 個
休止状態と postgresql を使用しています
どこから始めればよいのかさえわかりません。特に、各ストアでの購入を 3 つに制限する方法など、各店舗
ヒント、疑似解決策、または解決策をいただければ幸いです。
ありがとう
注:
残念ながら、私の側に重大な見落としがあります。
各概要を 1 行で取得したいと考えています
たとえば
id | Store | Product1 | count1 | price1 | Product2 | count2 | price2 | Product3 | count3 | price3
------------------------
------------------------
------------------------
----------------------
2 | Disney | stitch doll | 1 | 30 | donald cap | 3 | 15 | ticket | 2 | 100
5 | Universal | iron man figure | 1 | 100 | batman figure | 1 | 90 | null | null | null
理由は次のとおりです。結果をページ分割する必要があるため、ページごとに 10 件の購入概要を表示します。
各サマリーが 1 ~ 3 行を返す場合、次のページの結果を把握するのは困難です。
「購入数は合算されます」では、これらすべての購入に sum(count) を使用しますか?または単にカウント(*)します。価格はどうですか?うーん?単一の購入の価格を表示するのか、それとも購入したすべての製品の合計を表示するのか。 3 つのキャップの価格 15 は 3 * 5 として計算されますか、それとも 1 つのキャップの価格ですか?
–
user330315
2020 年 9 月 3 日、11:12
合計(カウント)。価格は個別価格となります。ありがとう
– ブディ
2020 年 9 月 3 日 11:21
@Budi あなたの質問との関連性冬眠状態にしますか?
– SternK
2020 年 9 月 3 日 11:31
したがって、製品と店舗の組み合わせごとに購入を集計したいとします。 「購入」を 3 つまでに制限しますか?その集計の後は?それとも集計前でしょうか?つまり、以前に実行した場合、同じ商品を 3 回購入すると、出力では 1 行として表示されます。
–
user330315
2020 年 9 月 3 日 11:41
SQL は、hql (休止状態のクエリ言語) として記述できます。適切な SQL を見つけたら、(移植性の理由から) HQL として書き直す可能性があります。
– ブディ
2020 年 9 月 3 日 12:52
------------------------
横結合を使用して、各ストアの最初の 3 つの購入情報を取得できます。
select s.name, p.*
from store s
cross join lateral (
select pr.name as product, pu.count, pr.price
from purchase pu
inner join product pr on pr.id = pu.productid
where pr.storeid = s.id and pu.userid = ?
order by pu.purchasetime
limit 3
) p
または、row_number(): を使用することもできます。
select *
from (
select pr.name as product, pu.count, pr.price,
row_number() over(partition by s.id order by pu.purchasetime) rn
from purchase pu
inner join product pr on pr.id = pu.productid
inner join store s on s.id = pr.storeid
where pu.userid = ?
) t
where rn <= 3
3
わかりましたこのエラー: 列「pr.price」 GROUP BY 句に指定するか、2 番目の解決策の集計関数で使用する必要があります。「pr.name」でも同じエラーが発生します。 1番目の解決策について。ありがとう
– ブディ
2020 年 9 月 3 日 23:37
@Budi: このクエリではそのエラーは発生しません。おそらく、group by 句を含む別のクエリに組み込んでいると思われます。
– GMB
2020 年 9 月 3 日 23:43
実際のデータベースを反映するように名前を調整した後、このエラーが発生しました。いずれにせよ、私の見落としがあります。要件を更新しました。お時間がありましたら、対処法を教えてください。ありがとう
– ブディ
2020 年 9 月 4 日 2:00