【发布时间】:2022-01-05 16:22:52
【问题描述】:
我的一个朋友想出了以下查询来查找获胜赌注
SELECT b1.*
FROM bids as b1
LEFT JOIN bids AS b2 ON b1.item_id = b2.item_id AND b1.bid_price < b2.bid_price
WHERE b2.item_id IS NULL
它似乎工作正常,但我不明白它是如何工作的,以及它是偶然的还是结果总是一样的。有人可以解释一下,它是如何工作的,尤其是 b1.bid_price < b2.bid_price 如何与显然不存在的 b2.bid_price 一起工作?
这里是转储:
CREATE TABLE `bids` (
`bid_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`bid_price` decimal(10,2) unsigned NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`item_id` int(11) unsigned NOT NULL,
`bid_date_created` datetime NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`bid_id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4
INSERT INTO bids VALUES (1, 14000.33, 12, 1, '2021-10-27 19:07:21');
INSERT INTO bids VALUES (2, 13000.60, 6, 1, '2021-10-27 18:07:21');
INSERT INTO bids VALUES (3, 21000.00, 7, 4, '2021-10-29 18:07:21');
INSERT INTO bids VALUES (4, 17000.25, 6, 4, '2021-10-27 18:07:21');
INSERT INTO bids VALUES (6, 5500.00, 6, 7, '2021-11-21 11:46:17');
INSERT INTO bids VALUES (7, 1000.00, 6, 29, '2021-11-22 11:21:41');
INSERT INTO bids VALUES (8, 18000.00, 6, 1, '2021-11-23 11:21:11');
INSERT INTO bids VALUES (9, 110.00, 14, 30, '2021-11-28 15:24:56');
INSERT INTO bids VALUES (10, 120.00, 13, 30, '2021-11-28 15:25:11');
INSERT INTO bids VALUES (11, 159.00, 14, 30, '2021-11-28 15:25:19');
INSERT INTO bids VALUES (12, 170.00, 13, 30, '2021-11-28 15:25:34');
INSERT INTO bids VALUES (13, 200.00, 14, 30, '2021-11-28 15:25:57');
INSERT INTO bids VALUES (14, 250.00, 13, 30, '2021-11-28 15:26:02');
INSERT INTO bids VALUES (15, 6000.00, 14, 6, '2021-11-28 15:26:30');
INSERT INTO bids VALUES (16, 7300.00, 13, 6, '2021-11-28 15:26:44');
INSERT INTO bids VALUES (17, 10000.00, 14, 6, '2021-11-28 15:29:14');
【问题讨论】:
-
它找到
b1,因此没有任何b2价格更高,所以b1价格最高。 -
当没有
b1.bid_price < b2.bid_price存在时,每个b2列都是null,因为left join。测试基础表的不可为空列null检测到这种情况。
标签: mysql sql join greatest-n-per-group