限制左连接返回一个结果?

Nat*_*ate 9 php mysql join left-join

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

LEFT JOIN movies t3 ON t1.movie_id = t3.movie_id AND t3.popularity = 0
Run Code Online (Sandbox Code Playgroud)

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

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

我试过这个:

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
Run Code Online (Sandbox Code Playgroud)

第二个查询因错误而死:

Every derived table must have its own alias
Run Code Online (Sandbox Code Playgroud)

我知道我问的是有点模糊,因为我没有提供完整的查询,但我一般都会问这个问题吗?

Mic*_*ski 18

错误很明显 - 您只需要在子查询结束后为子查询创建别名,)并在ON子句中使用它,因为每个表派生或真实都必须有自己的标识符.然后,您需要movie_id在子查询的选择列表中包含以便能够加入它.由于子查询已包含WHERE popularity = 0,因此您无需将其包含在join的ON子句中.

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
Run Code Online (Sandbox Code Playgroud)

如果您在外部使用其中一列,请SELECT通过the_alias.movie_name例如引用它.

更好地理解要求后更新:

要使每个组加入一个,可以使用聚合MAX()MIN()movie_id子查询中对其进行分组.LIMIT然后不需要子查询- 您将收到第一个movie_id每个名称MIN()或最后一个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
Run Code Online (Sandbox Code Playgroud)

  • 先生,您真是个天才!它工作得很漂亮!我想现在我应该尝试真正理解它是如何工作的:-) 谢谢! (2认同)

Eri*_*son 10

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    
)
Run Code Online (Sandbox Code Playgroud)