java - postgresql - 制限付きでテーブルを結合する

okwaves2024-01-25  10

各ストアからの最初の 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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。