2010-02-04 50 views
3

我正在開發中的出價在表中以下格式舉行的拍賣程序:MySQL的選擇和分組行,如果一個又一個

id | user_id | auction_id | placed_at 

我想按用戶ID出價並選擇他們的計數,但只有當用戶id出現一個接一個。這些出價是通過置於_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 

我怎樣才能實現這個結果?結果將用於生成拍賣的活動流,因此它們將用於生成字符串,例如「約翰史密斯在此次拍賣上出價兩次」。如果有幫助,該應用程序使用Ruby on Rails構建。

預先感謝您。

+0

爲什麼有人會連續兩次沒有人競標?這是正常的嗎? – 2010-02-04 14:45:29

+0

我們可以假設輸入數據僅包含一次拍賣的數據嗎? – 2010-02-04 14:48:19

+0

這是一場比真實拍賣更多的遊戲拍賣,所以有人會連續兩次出價。你是對的,這隻包括來自一個拍賣的數據。 – mjaz 2010-02-04 15:04:57

回答

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 
+0

哇。這是一個很好的問題。 – mjaz 2010-02-04 14:40:50

+0

@Quassnoi,我認爲這適用於一次拍賣,但是如果你添加這一行:(2,1,2,'01-04-2010 00:00:03'),它會給出(2,1,1 ,1,1)而不是(2,2,1,1)拍賣1.我認爲你需要'ORDER BY auction_id,placed_at DESC'。 – 2010-02-04 14:50:16

+0

完美...它的工作原理。謝謝! – mjaz 2010-02-04 15:03:21

相關問題