【问题标题】:Count all items on which a user is the high bidder计算用户出价最高的所有项目
【发布时间】:2013-07-31 20:11:19
【问题描述】:

我目前正在开发一个拍卖系统,功能齐全。我现在需要在用户的个人资料中添加一个计数,以显示用户当前竞标的商品数量。

系统由两个关键表组成(当然系统中有额外的表功能,但这些是与此问题相关的唯一表):

item_sales:

+-----+------------------+------------+-------------+---------+
| id  |  selling_format  |  duration  |  list_date  |  buyer  |
+-----+------------------+------------+-------------+---------+

item_sales_bids:

+-----+-------------+-----------+---------------+-----------+--------+
| id  |  sale_item  |  user_id  |  current_bid  |  max_bid  |  date  |
+-----+-------------+-----------+---------------+-----------+--------+

item_sales_bids.date 是投标时间的 Unix 时间戳。

我可以通过以下查询轻松计算给定用户的所有出价:

   SELECT COUNT(DISTINCT(`item_sales_bids`.`user_id`)) AS `total`,
          SUM((`sale`.`list_date` + (`sale`.`duration` * 86400)) - UNIX_TIMESTAMP()) AS `endTime`
     FROM `item_sales_bids`
INNER JOIN `item_sales` `sale` ON `item_sales_bids`.`sale_item` = `sale`.`id`
     WHERE `user_id` = 1
  GROUP BY `sale_item`
    HAVING `endTime` > 0

我想做的是运行与上述类似的查询,但仅包括指定用户是当前最高出价者的记录(即,给定项目的出价集的最大 ID 条目具有 user_id 值= 给我们的用户)。

不幸的是,我不知道如何实现这一目标。

我已经设置了一个 SQLFiddle 来协助 > http://sqlfiddle.com/#!2/b98e4/3

【问题讨论】:

  • 只是一个想法-我可能错了-您需要定义规格:-为所有 item_sales 获得最高出价者并添加出价者所需的信息,例如所有出价的计数。希望这会有所帮助
  • 获取其他信息没问题 - 我只需要计数。
  • 我很懒,所以我会将拍卖表非规范化并保留对最高出价者的引用。这样就很简单了:)
  • 是的,我想过这样做,但下面的查询似乎相对简单。

标签: mysql sql


【解决方案1】:

执行 subs 查询以获取所有商品的最新出价,然后将其加入 item_sales_bids 以仅处理最新商品。

类似这样的:-

SELECT COUNT(DISTINCT(item_sales_bids.user_id)) AS total,
SUM((sale.list_date + (sale.duration * 86400)) - UNIX_TIMESTAMP()) AS endTime
FROM item_sales_bids
INNER JOIN item_sales sale ON item_sales_bids.sale_item = sale.id
INNER JOIN
(
    SELECT sale_item, MAX(id) AS LatestBid
    FROM item_sales_bids
    GROUP BY sale_item
) Sub1
ON item_sales_bids.sale_item = Sub1.sale_item AND item_sales_bids.id = Sub1.LatestBid
WHERE user_id = 1
GROUP BY item_sales_bids.sale_item
HAVING endTime > 0

【讨论】:

  • 更正了一些错别字。尽管 user_id 1 不是您的测试数据的最新出价者,但没有返回任何内容
【解决方案2】:

这应该可以解决问题。在用户 1 和 2 之间切换将显示所需的行为。在示例数据中,用户 1 没有返回任何数据(他们不是最高出价者),用户 2 返回一行,当前最高出价为 50。

    SELECT COUNT(DISTINCT(`bids`.`user_id`)) AS `total`,
  `highbids`.`sale_item`,
  `highbids`.`maxBid`,
  SUM((`sale`.`list_date` + (`sale`.`duration` * 86400)) - UNIX_TIMESTAMP()) AS `endTime`
FROM `item_sales_bids` `bids`
INNER JOIN `item_sales` `sale` ON `bids`.`sale_item` = `sale`.`id`
INNER JOIN (SELECT MAX(`current_bid`) AS `maxBid`, `sale_item`, `user_id` 
  FROM `item_sales_bids` 
  GROUP BY `sale_item`, `user_id`
  ORDER BY `current_bid` DESC LIMIT 1,1) 
AS `highbids` ON `bids`.`user_id` = `highbids`.`user_id`
WHERE `bids`.`user_id` = 2
GROUP BY `bids`.`sale_item`
HAVING `endTime` > 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多