【问题标题】:Need MySQL Query Guru (intersection of record data)Need MySQL Query Guru(记录数据的交集)
【发布时间】:2011-02-26 22:40:51
【问题描述】:

假设我有一张如图所示的表格:

id, auctionUser, auctionId, MinPrice, NumBids, PlacedBids

然后说我在上表中有以下条目具有相同的auctionId:

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

有没有办法编写一个查询( WHEREuctionId = 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 大师有想法。我想如果有办法做到这一点,从尝试使用 php 循环并产生结果的查询中产生它可能会快得多......也许不是。

与往常一样,非常感谢您在这方面的任何时间和建议!

【问题讨论】:

  • 数据是否正确? 10.25 + 20 出价(1c 增量)甚至没有达到 10.50
  • 你在某种意义上是正确的。为了简单起见,我只是使用了基本数据。我只是想弄清楚 MinPrice 和 NumBids 中的重叠范围,如何生成交替的行序列,如果投标人具有重叠的自动投标设置,直到重叠不再存在,我才能为投标创建条目.我认为下面关于数字表的答案在正确的轨道上......
  • 所以让我说对了,你的起拍价是 10.25,来自 1 个用户,他们有 20 个出价,你有另一个用户有 50 个出价,现在拍卖高达 10.72。所以每次出价总是增加 0.01?
  • 是的,每次出价为 0.01 增量。也许我的一个出价从 10.25 开始,另一个从 10.50 开始,这让我有些失望。我应该从 10.50 开始 - 一个有 20 个出价,另一个有 50 个出价。在现实中,将有不止 2 个用户具有起始 MinPrice 和 NubBids。我主要是想找到一种方法来根据起始 MinPrice 和 NumBids 的重叠生成出价行(以 0.01 为增量)。此应用程序是一个具有自动出价功能的拍卖网站,可让用户根据 X NumBids 的 MinPrice 进行系统自动出价。

标签: mysql


【解决方案1】:

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

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

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

【讨论】:

  • 我认为您在这里的方向是正确的...不知道如何为 MinPrice 和 NumBids 重叠的多个用户交替行?!?
  • @Michael,我更新了我的答案以回应您上面的一些 cmets。
  • 这是你的时间。我尝试了一段时间以获取您的示例并使其符合我的要求,但一段时间后我不得不放弃努力并采用程序解决方案来保持项目的进展。当我有时间看看我能不能让它工作时,我会回去!再次感谢。
猜你喜欢
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
相关资源
最近更新 更多