0

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;

返却日がないことに注意してください。これは、誰かがこのアイテムを要求し、新しい賃借人にも無期限で転送されるまで、最後の賃借人が無期限のレンタル時間を持っているためです。ユーザーは複数のアイテムをレンタルできますが、各アイテムは 1 つしかないため、item_id を同時に 2 人のユーザーに送信することはできません。

現在レンタル中のアイテムを user_id ごとに表示したいと思います。

4

1 に答える 1

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の質問です。答えはここで説明されています

使用する

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  
于 2010-06-04T12:00:55.690 に答える