我的表格如下:
# Table user
user_id PK
...
# Table buy
buy_id PK
user_id FK
...
# Table offert
offert_id
user_id
...
我需要知道1'用户'的最后'买'并获得'用户'的'offert'计数,我尝试过这样的话:
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
但它总是返回第一个'买'而不是最后一个,看起来像这个订单不会产生任何影响
我知道我可以使用子查询来完成它但是我想知道是否有一种方法可以使用子查询,也许使用max函数但idk如何做。
感谢。
答案 0 :(得分:0)
您的方法无法保证正常工作。一个重要原因是在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
。