我有一个MySQL数据库,有两个表格(这个问题简化了):
电影表格列:id
,title
,duration
,description
,created_at
,updated_at
租借表格列:id
,movie_id
,status
,created_at
,updated_at
租赁状态为“已检查”或“已退回”,因此如果某个电影没有关联的租借,或者其所有相关租借的状态为“已返回”,则可以使用该电影。如何查询可用的电影?现在我有了这个:
SELECT rentals.id,rentals.status,movies.*
FROM `movies`
LEFT OUTER JOIN rentals ON movies.id = rentals.movie_id
AND movies.kiosk_id = rentals.kiosk_id
WHERE (`movies`.kiosk_id = 1
AND (rentals.id is null or rentals.status != 'CHECKED OUT'));
问题是,如果多次检出电影,此查询会返回多个电影记录,因此我的ORM会为我提供重复的电影对象。有没有办法指定我只想要唯一的movie.id
?我应该有一些不同的数据库架构吗?或者我应该以编程方式对其进行排序(看起来它会太慢)?
答案 0 :(得分:2)
我不确定您想要的租金ID,所以我把它拿出来了。
SELECT
rentals.status, movies.*
FROM movies
LEFT OUTER JOIN (
SELECT
movie_id,
kiosk_id,
-- Because 'CHECKED OUT' comes alphabetically before 'RETURNED',
-- this will have 'CHECKED OUT' if there's at least one rental checked out
MIN(status) AS status
FROM rentals
GROUP BY movie_id, kiosk_id) rentals
ON movies.id = rentals.movie_id
AND movies.kiosk_id = rentals.kiosk_id
WHERE movies.kiosk_id = 1
AND (rentals.id is null or rentals.status != 'CHECKED OUT');
答案 1 :(得分:0)
我认为您需要查询中的distinct rental.id。试试这个:
SELECT DISTINCT rentals.id,rentals.status,movies.*
FROM `movies`
LEFT OUTER JOIN rentals ON movies.id = rentals.movie_id
AND movies.kiosk_id = rentals.kiosk_id
WHERE (`movies`.kiosk_id = 1
AND (rentals.id is null or rentals.status != 'CHECKED OUT'));
答案 2 :(得分:0)
为什么LEFT OUTER JOIN?一个简单的LEFT JOIN就足够了。
你还应该将rental.status移动到ON()位(我认为):
SELECT DISTINCT movies.id, movies.*, rentals.id, rentals.status
FROM `movies`
LEFT JOIN rentals ON (movies.id = rentals.movie_id AND movies.kiosk_id = rentals.kiosk_id AND rentals.status != 'CHECKED OUT')
WHERE `movies`.kiosk_id = 1 AND rentals.id is null
//编辑 你还需要一个独特的
答案 3 :(得分:0)
你想要一个没有意义的结果的问题。你想要可用的电影 - 没关系,但租赁ID在某个电影ID的同一行中意味着什么?你应该扔掉SELECT列表中的租借,然后将DISTINCT应用到movies.id就可以了。
答案 4 :(得分:0)
如果您需要租借所有可用的电影,可以试试这个:
SELECT movies.*
FROM movies
LEFT JOIN (
SELECT DISTINCT movie_id
FROM rentals
WHERE status!='CHECKED OUT' AND kiosk_id=1) r ON movies.movie_id=r.movie_id