2011-02-26 28 views
0

說我有一個表,如下所示:需要MySQL查詢大師(記錄數據的交集)

id, auctionUser, auctionId, MinPrice, NumBids, PlacedBids 

然後說我已經得到了上面的表下面的條目具有相同的auctionId:

1 | user1 | 99 | 10.25 | 20 | 0 
2 | user2 | 99 | 10.50 | 50 | 0 

有沒有辦法寫一個查詢(WHERE auctionId = 99),它會返回一行爲MinPrice中每兩個行相交的0.01(不知道這是不是正確的詞,但它是最好的我可以想出來描述它)基於NumBids中的出價數量?因此,對於上面的數據,兩個用戶從10.50到10.75會有一個「相交」。我希望能夠創造流動數據顯示,像這樣,交替用戶之間的競價投標的NumBids集數:

(bidAmount) | (auctionUser) | NumBids | PlacedBids 
10.50 | user2 | 50 | 1 
10.51 | user1 | 20 | 1 
10.52 | user2 | 50 | 2 
10.53 | user1 | 20 | 2 
10.54 | user2 | 50 | 3 
10.55 | user1 | 20 | 3 
. 
. 
. 
10.70 | user2 | 50 | 20 
10.71 | user1 | 20 | 20 <-- ends here for user1 since 20 NumBids would be used up 
10.72 | user2 | 50 | 21 

我甚至不知道這是否可能通過sql查詢或不 - 甚至如何啓動這樣的查詢。我想我會把它扔到那裏,看看是否有任何sql大師的想法。我想如果有辦法做到這一點,從試圖使用php循環併產生結果的查詢生成它可能會快得多......也許不會。

與往常一樣,MUCHO感謝您的任何時間和建議,您可以在此留出餘地!

+0

這些數據是否正確? 10.25 + 20出價(1c增量)甚至沒有達到10.50 – RichardTheKiwi 2011-02-26 23:12:36

+0

你在某種意義上是正確的。爲了簡單起見,我只使用了基本數據。我只是試圖找出MinPrice和NumBids中存在一系列重疊的情況,以及如何生成交替的行序列,以便我可以爲出價創建條目,如果出價工具有重疊的自動出價設置,直到重疊不再存在。我想下面的答案關於一個數字表,它在正確的軌道上... – Michael 2011-02-27 01:47:13

+0

所以,讓我得到這個權利,你有你的起始出價價格是從一個用戶10.25,他們有20個出價,你有另一個用戶已有50個出價,拍賣現在高達10.72。所以每次出價總是0.01增量? – 2011-02-27 02:25:04

回答

0

我不能說我完全理解你想要什麼,但我認爲你需要生成行。生成行的一種方法是使用Numbers表,該表基本上是連續整數的表。

看看我對this question的回答。它與你的問題沒有關係,但有代碼可以生成這樣的數字表。

因此,如果您想爲每個0,01差異生成1行,您將計算美分(或任何貨幣),並通過n < nr_of_cents上的過濾器加入數字表。

編輯: 好吧,我會試試。首先是一些樣本數據。

create table auctions(
    auctionuser int 
    ,auctionid int 
    ,minprice  decimal(5,2) 
    ,numbids  int 
); 

insert into auctions values(1, 1, 2.20, 2); 
insert into auctions values(2, 1, 3.30, 4); 
insert into auctions values(3, 1, 4.40, 6); 

select * 
    from auctions 
where auctionid = 1; 

+-------------+-----------+----------+---------+ 
| auctionuser | auctionid | minprice | numbids | 
+-------------+-----------+----------+---------+ 
|   1 |   1 |  2.20 |  2 | 
|   2 |   1 |  3.30 |  4 | 
|   3 |   1 |  4.40 |  6 | 
+-------------+-----------+----------+---------+ 
3 rows in set (0.00 sec) 

認爲以下是接近你想要什麼。請注意,我使用了我鏈接到的帖子中的數字表格。

select a.auctionuser 
     ,n as user_bid 
     ,minprice 
     ,numbids 
     ,a.minprice + (0.01 * (n-1)) as bid 
    from auctions a 
     ,numbers 
where numbers.n <= a.numbids 
    and a.auctionid = 1 
order 
    by n 
     ,a.minprice 
     ,a.auctionuser; 


+-------------+----------+----------+---------+------+ 
| auctionuser | user_bid | minprice | numbids | bid | 
+-------------+----------+----------+---------+------+ 
|   1 |  1 |  2.20 |  2 | 2.20 | 
|   2 |  1 |  3.30 |  4 | 3.30 | 
|   3 |  1 |  4.40 |  6 | 4.40 | 
|   1 |  2 |  2.20 |  2 | 2.21 | 
|   2 |  2 |  3.30 |  4 | 3.31 | 
|   3 |  2 |  4.40 |  6 | 4.41 | 
|   2 |  3 |  3.30 |  4 | 3.32 | 
|   3 |  3 |  4.40 |  6 | 4.42 | 
|   2 |  4 |  3.30 |  4 | 3.33 | 
|   3 |  4 |  4.40 |  6 | 4.43 | 
|   3 |  5 |  4.40 |  6 | 4.44 | 
|   3 |  6 |  4.40 |  6 | 4.45 | 
+-------------+----------+----------+---------+------+ 
12 rows in set (0.00 sec) 
+0

我認爲你在這裏正確的軌道...不知道我會如何去交替行的多個用戶有MinPrice和NumBids重疊?!? – Michael 2011-02-27 01:48:35

+0

@邁克爾,我回應了上面的一些評論,更新了我的答案。 – Ronnis 2011-02-27 07:26:10

+0

這就是你在這個時間。我嘗試了一段時間,拿出你的例子,並讓它符合我的要求,但過了一段時間,我不得不放棄努力,並採用程序化解決方案,以保持項目的順利進行。當我有時間看看我是否可以讓它工作時,我會回去!再次感謝。 – Michael 2011-02-28 01:58:44