0

我们有一个系统,用户可以向我们发送一袋袋货物。

我正在尝试弄清楚如何使用计算字段来吸引用户,以了解他们发送第三包商品的日期。历史表上指示此事件的状态为“已处理”。如果我只想获取特定包的收到日期,我会写:

SELECT bags.created_at FROM history 
WHERE history.state='received' AND history.bag_id LIMIT 1

这是我们的表格:

users
  id

bags
  user_id

history
  state
  bag_id
  created_at

最终目标是一个选择查询,它为我们提供用户记录并添加“字段” 3rd_bag_received_at

有任何想法吗?

4

2 回答 2

3

您可以group byuser_id,然后添加一个having子句以仅包含具有count(distinct bag_id) >= 3.

然后limit到3,并order by获取最新日期max(created_at)

这有帮助吗?

实现看起来像这样:

select 
 user.id, 
 max(history.created_at) as third_bag_received_at

from
(

 select 
   user.id, 
   max(history.created_at)

 from 
   users

   inner join bags
   on user.id = bags.user_id

   inner join history
   on bags.id = history.bag_id

 where history.state = 'processed'

 group by
   user.id

 having
   count(history.bag_id >= 3)

 limit 3

 order by 2 -- does this work in mySql? (It means "column 2" in MS SQL)
)

Limit 1

编辑:如何解决计算列中其他表的连接/聚合问题:

我可能不会将此添加为计算列,而是创建一个包含此要求所需的任何信息的视图,包括third_bag_received基于此查询的列。

但是,如果您确实需要将其实现为表格上的计算列:

我建议创建一个接受您user.id作为输入并返回值的用户函数third_bag_received_at(同样,基于上述查询的逻辑)。

然后从您的计算列中调用此函数。请参阅@user10635对此 SO 问题的回答。

于 2012-10-12T01:49:23.083 回答
0

我只是在开发更多的 Sepster 答案以使其清楚。这个问题是不稳定的,因为它没有说桌袋有任何名为bags.id的字段,我必须弥补它。

SELECT users.id, MAX(history.created_at) as 3rd_bag_received_at
FROM users LEFT JOIN bags ON (users.id=bags.user_id)
LEFT JOIN history ON(bags.id = history.bag_id)
WHERE history.state='received'
GROUP BY users.id
HAVING COUNT(history.bag_id) >= 3;
于 2012-10-12T02:01:46.890 回答