如果您了解sakila示例数据库,那么选择当前用户租用的项目的语句是什么。 如果不是,这里是代码说明:
CREATE TABLE IF NOT EXISTS `rentals` (
`item_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`last_change_date` date NOT NULL,
PRIMARY KEY (`item_id`,`user_id`,`last_change_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
请注意,没有返回日期,这是因为最后一个租房者有无限的租赁时间,直到有人请求此项目并且它也会无限期地转移到新租房者。用户可以租用多个项目,每个项目只有一个,因此item_id不能同时转到两个用户。
我想按user_id显示当前租借的商品。
答案 0 :(得分:0)
SELECT r1.*
FROM rentals r1
LEFT JOIN rentals AS r2
ON r1.item_id = r2.item_id
AND r1.last_change_date < r2.last_change_date
WHERE r2.last_change_date IS NULL
这是一个经典的SQL问题。答案是explained here。
使用
INSERT INTO rentals (item_id, user_id, last_change_date) VALUES (1, 1, '2009-01-01'), (1, 3, '2009-11-10'), (3, 3, '2009-02-13'), (3, 5, '2010-05-11'), (5, 5, '2010-06-04'), (7, 7, '2010-06-04'), (9, 9, '2010-06-04');
作为播放数据,要了解方法,请查看
的输出SELECT r1.*,r2.*
FROM rentals r1
LEFT JOIN rentals AS r2
ON r1.item_id = r2.item_id
AND r1.last_change_date < r2.last_change_date
+---------+---------+------------------+---------+---------+------------------+
| item_id | user_id | last_change_date | item_id | user_id | last_change_date |
+---------+---------+------------------+---------+---------+------------------+
| 1 | 1 | 2009-01-01 | 1 | 3 | 2009-11-10 |
| 1 | 3 | 2009-11-10 | NULL | NULL | NULL |
| 3 | 3 | 2009-02-13 | 3 | 5 | 2010-05-11 |
| 3 | 5 | 2010-05-11 | NULL | NULL | NULL |
| 5 | 5 | 2010-06-04 | NULL | NULL | NULL |
| 7 | 7 | 2010-06-04 | NULL | NULL | NULL |
| 9 | 9 | 2010-06-04 | NULL | NULL | NULL |
+---------+---------+------------------+---------+---------+------------------+
前3列引用r1
列,最后3列引用r2
。
如您所见,只要没有r2.last_change_date
大于r1.last_change_date
,该值就为NULL。这些是r1.last_change_date
最大的行。因此,要查找所需的行,请使用
条件
WHERE r2.last_change_date IS NULL