从MySQL join返回唯一的表id

时间:2009-12-19 22:47:49

标签: sql mysql

我有一个MySQL数据库,有两个表格(这个问题简化了):
电影表格列:idtitledurationdescriptioncreated_atupdated_at
租借表格列:idmovie_idstatuscreated_atupdated_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?我应该有一些不同的数据库架构吗?或者我应该以编程方式对其进行排序(看起来它会太慢)?

5 个答案:

答案 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