MySQL根据问题按顺序排列

时间:2013-05-18 19:05:17

标签: mysql

我的表格如下:

# 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如何做。

感谢。

1 个答案:

答案 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