说我有一张如图所示的表:
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循环并生成结果的查询中生成它可能要快得多......但也许不是。
一如既往,多谢所有时间和建议你可以随意使用!
答案 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)