2010-06-04 43 views
0

如果您瞭解sakila示例數據庫,那麼選擇當前由用戶租用的項目的語句是什麼。 如果不是在這裏是一個代碼解釋:從mysql中的租賃表中選擇以顯示用戶當前租用的項目

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
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 
+0

這似乎是做的事情。非常感謝你。 感謝您的鏈接。 – kdobrev 2010-06-04 12:12:35