将左联接限制为返回一个结果?

2022-08-31 00:25:57

我目前将此左联接作为查询的一部分:

LEFT JOIN movies t3 ON t1.movie_id = t3.movie_id AND t3.popularity = 0

麻烦的是,如果有几部电影具有相同的名称和相同的受欢迎程度(不要问,就是这样:-)),则会返回重复的结果。

总而言之,我想将左联接的结果限制为一个。

我试过这个:

LEFT JOIN 
    (SELECT t3.movie_name FROM movies t3 WHERE t3.popularity = 0 LIMIT 1)
     ON t1.movie_id = t3.movie_id AND t3.popularity = 0

第二个查询因错误而死机:

Every derived table must have its own alias

我知道我问的有点模糊,因为我没有提供完整的查询,但我问的通常是可能的吗?


答案 1

错误很明显 - 您只需要在子查询关闭后为其创建一个别名,并在子句中使用它,因为每个表,派生或实表,都必须有自己的标识符。然后,您需要包含在子查询的选择列表中才能加入该子查询。由于子查询已包含 ,因此无需将其包含在联接子句中。)ONmovie_idWHERE popularity = 0ON

LEFT JOIN (
  SELECT
    movie_id, 
    movie_name 
  FROM movies 
  WHERE popularity = 0
  ORDER BY movie_name
  LIMIT 1
) the_alias ON t1.movie_id = the_alias.movie_id

如果您在外部 使用这些列之一,例如通过以下方式引用它。SELECTthe_alias.movie_name

更好地了解要求后进行更新:

若要获取每个组的联接对象,可以使用聚合或在 子查询中将其分组。这样就不需要子查询了 -- 您将收到每个名称的第一个带有 或 最后一个带有 .MAX()MIN()movie_idLIMITmovie_idMIN()MAX()

LEFT JOIN (
  SELECT
    movie_name,
    MIN(movie_id) AS movie_id
  FROM movies
  WHERE popularity = 0
  GROUP BY movie_name
) the_alias ON t1.movie_id = the_alias.movie_id

答案 2
LEFT JOIN movies as m ON m.id = (
    SELECT id FROM movies mm WHERE mm.movie_id = t1.movie_id
    ORDER BY mm.id DESC
    LIMIT 1    
)

推荐