【问题标题】:MySQL selecting and grouping rows if one after another如果一个接一个地选择和分组行
【发布时间】:2010-02-04 14:30:55
【问题描述】:

我正在开发一个拍卖应用程序,其中出价保存在表格中,格式如下:

id | user_id | auction_id | placed_at

我想按用户 ID 对出价进行分组并选择其计数,但前提是用户 ID 一个接一个出现。出价按placed_at 降序排列。这就是我的意思:

1 | 1 | 1 | 01-04-2010 00:00:06
2 | 1 | 1 | 01-04-2010 00:00:05
3 | 2 | 1 | 01-04-2010 00:00:04
4 | 2 | 1 | 01-04-2010 00:00:03
5 | 3 | 1 | 01-04-2010 00:00:02
6 | 2 | 1 | 01-04-2010 00:00:01

在这种情况下,我应该得到:

count | user_id | auction_id
  2   |    1    |     1
  2   |    2    |     1
  1   |    3    |     1
  1   |    2    |     1

我怎样才能达到这个结果?结果将用于生成拍卖的活动流,因此它们将用于生成字符串,例如“John Smith 在此拍卖中出价 2 次”。如果有帮助,该应用程序是使用 Ruby on Rails 构建的。

提前谢谢你。

【问题讨论】:

  • 为什么有人会连续两次出价而中间没有人出价?这正常吗?
  • 我们可以假设输入数据只包括来自一次拍卖的数据吗?
  • 这更像是一场游戏拍卖而不是真正的拍卖,所以是的,人们会连续出价两次。您是对的,这仅包括来自一次拍卖的数据。
  • 如果只需要一次拍卖,查询可以比Quassnoi的建议简单一点。

标签: mysql group-by


【解决方案1】:
SELECT  user_id, auction_id, COUNT(*)
FROM    (
        SELECT  @r := @r + CASE WHEN @user_id = user_id AND @auction_id = auction_id THEN 0 ELSE 1 END AS _g,
                user_id, auction_id,
                @user_id := user_id,
                @auction_id := auction_id
        FROM    (
                SELECT  @r := 0,
                        @user_id := NULL,
                        @auction_id := NULL
                ) vars,
                mytable
        ORDER BY
                auction_id DESC, placed_at DESC
        ) q
GROUP BY
        user_id, auction_id, _g
ORDER BY
        _g

【讨论】:

  • @Quassnoi,我认为这适用于一次拍卖,但如果你添加这一行:(2, 1, 2, '01-04-2010 00:00:03'),它会给出计数拍卖 1 的 (2,1,1,1,1) 而不是 (2,2,1,1)。我认为您需要 ORDER BY auction_id, placed_at DESC
  • @Mark:如果我们应该只将一次拍卖的出价组合在一起,那么是的,你是对的。这对我来说最初还不够清楚,但现在当我重读这个问题时,我认为这正是@op 的意思。
猜你喜欢
  • 1970-01-01
  • 2013-08-05
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多