0

私のテーブルは次のようになります。

# Table user

user_id PK
...

# Table buy

buy_id PK
user_id FK
...

# Table offert

offert_id
user_id
...

さて、1人の「ユーザー」の最後の「購入」を知り、この「ユーザー」が持っている「オファー」の数を取得する必要があります。次のようなことを試しました:

select b.buy_id,count(distinct c.offert_id) as cv from user a
inner join buy b using(user_id) left join offert c using(user_id) where a.user_id=4
group by a.user_id order by b.buy_id desc

ただし、最後ではなく常に最初の「購入」を返します。この順序は何の効果もないように見えます

私はサブクエリでそれを行うことができることを知っていますが、おそらく最大関数を使用してサブクエリを使用する方法があるかどうかを知りたいのですが、それを行う方法をidkします。

ありがとう。

4

1 に答える 1

0

あなたのアプローチがうまくいくとは限りません。大きな理由の 1 つは、 が のgroup by前に処理されることorder byです。

各ユーザーの最大を意味すると仮定すると、buy_idこれは次のように行うことができます。

select u.user_id, u.last_buy_id, count(distinct o.offert_id)
from (select u.*,
             (select buy_id from buy b where u.user_id = u.user_id order by buy_id desc limit 1
             ) last_buy_id
      from user u
     ) left outer join
     offert o
     on o.user_id = u.user_id
group by u.user_id;

最初のサブクエリは、相関サブクエリを使用して、各ユーザーの最終購入 ID を取得します。その後、参加offertして集計を行います。このバージョンにはuser_id集計に が含まれていることに注意してください。

于 2013-05-18T19:19:10.483 に答える