需要MySQL Query Guru(记录数据的交集)

时间:2011-02-26 22:40:51

标签: 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),每两个行“相交”的每0.01个MinPrice都会返回一行(不知道这是否是正确的单词,但它是最好的我可以根据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 guru的想法和想法。我想如果有办法做到这一点,从试图使用php循环并生成结果的查询中生成它可能要快得多......但也许不是。

一如既往,多谢所有时间和建议你可以随意使用!

1 个答案:

答案 0 :(得分:0)

我不能说我完全理解你想要的东西,但我认为你需要生成行。生成行的一种方法是使用Numbers表,它基本上是一个连续整数的表。

查看我对this question的回答。它与您的问题无关,但有代码可以生成这样的数字表。

因此,如果您想为每个0,01差异生成1行,您将计算nr的分数(或者货币的任何值)并使用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)