Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅从MySQL连接返回唯一的表id_Sql_Mysql - Fatal编程技术网

仅从MySQL连接返回唯一的表id

仅从MySQL连接返回唯一的表id,sql,mysql,Sql,Mysql,我有一个数据库,其中包含两个简化的表,用于解决此问题: 电影表列:id、标题、持续时间、描述、创建时间、更新时间 租金表列:id、电影id、状态、创建时间、更新时间 租赁状态为“已签出”或“已归还”,因此,如果电影没有关联的租赁,或其所有关联的租赁状态为“已归还”,则电影可用。如何查询可用电影?现在我有了这个: SELECT rentals.id,rentals.status,movies.* FROM `movies` LEFT OUTER JOIN rentals ON movies.i

我有一个数据库,其中包含两个简化的表,用于解决此问题: 电影表列:id、标题、持续时间、描述、创建时间、更新时间 租金表列:id、电影id、状态、创建时间、更新时间

租赁状态为“已签出”或“已归还”,因此,如果电影没有关联的租赁,或其所有关联的租赁状态为“已归还”,则电影可用。如何查询可用电影?现在我有了这个:

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将为我提供重复的电影对象。有没有办法指定我只想要唯一的电影id?我应该有一些不同的数据库模式吗?或者我应该按程序对其进行排序,看起来太慢了?

我想您希望在查询中使用不同的rentals.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'));

我不知道你想要什么,所以我把它拿出来了

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');

为什么左外连接?一个简单的左连接就足够了

您还应该将rentals.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
//编辑
你还需要一个明确的

你的问题,你想要一个毫无意义的结果。你想要可用的电影-这没关系,但是在同一行中租赁id和电影id意味着什么?您应该在选择列表中放弃租借,然后仅对电影应用DISTINCT。id将完成此操作

如果您需要所有可用的电影进行租借,您可以尝试以下方法: 选择电影* 来自电影 左连接 选择不同的电影id 租金
状态在哪里!='“已签出”和kiosk_id=1 r ON movies.movie_id=r.movie_id

no,当我向查询中添加DISTINCT时,它与不添加DISTINCT时相同。有没有办法指定哪个字段是不同的?这不起作用,因为很可能每个租赁都有自己的ID。因此,如果没有不同的,结果事件中不会有重复项,但是会有重复的电影。idA LEFT JOIN和LEFT OUTER JOIN是一样的。您回答的唯一问题是,我需要在第二次选择后添加“id”,但之后效果很好,谢谢!