我有一个存储出价的下表
╔════════════╦═══════════╦══════════════════════╗
║ 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 bidder
,N bidder
,date
的查询。在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