Выберите из таблицы аренды в MySQL, чтобы отобразить элементы, арендованные в настоящее время пользователем - PullRequest
0 голосов
/ 04 июня 2010

Если вы знаете об образце базы данных 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.

1 Ответ

0 голосов
/ 04 июня 2010
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  
...