我有一个存储出价的下表

╔════════════╦═══════════╦══════════════════════╗
║ lot_id     ║  user_id  ║         date         ║
╠════════════╬═══════════╬══════════════════════╣
║ 123        ║ 9001      ║ 2017-08-09 14:33:55  ║
║ 123        ║ 9005      ║ 2017-08-09 14:33:55  ║
║ 123        ║ 9001      ║ 2017-08-09 14:44:55  ║
║ 124        ║ 8012      ║ 2017-08-09 14:55:55  ║
║ 124        ║ 9001      ║ 2017-08-09 14:55:55  ║
║ 124        ║ 9076      ║ 2017-08-09 14:66:55  ║
╚════════════╩═══════════╩══════════════════════╝

其思想不是显示用户id(出于安全原因),而是显示用户序号(顺序?)这取决于他出价的时间。
我需要一个根据first bidder返回我second bidderN bidderdate的查询。
在PHP中这样做效率很低。
另外,这是一个很难解决的问题,所以任何关于题目的建议都是受欢迎的。
更新
行号不起作用。如果同一用户进行多个出价,则数字应相同。例如,如果同一个用户已经进行了第10次出价,它应该显示first bidder

最佳答案

您可以使用子查询根据日期为每个用户id分配一个数字。
然后将该子查询连接到bids表并使用该投标人的编号。
例子:

-- Sample data
create table bidstable (lot_id int, user_id int, `date` datetime);
insert into bidstable (lot_id, user_id, `date`) values
(123,9001,'2017-08-09 14:33:55'),
(123,9005,'2017-08-09 14:33:55'),
(123,9001,'2017-08-09 14:44:55'),
(124,8012,'2017-08-09 14:55:55'),
(124,9001,'2017-08-09 14:55:55'),
(124,9076,'2017-08-09 14:56:55');

SELECT lot_id, concat('bidder ', n) as bidder, `date`
FROM bidstable AS bids
JOIN (
  SELECT user_id, @n := @n + 1 as n
  FROM bidstable
  CROSS JOIN (SELECT @n := 0) vars
  GROUP BY user_id
  ORDER BY MIN(`date`), user_id
) AS bidders ON bidders.user_id = bids.user_id
ORDER BY `date`;

SQL小提琴测试here

09-12 11:35