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

时间:2012-07-09 02:27:50

标签: php mysql join left-join

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

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

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

5 个答案:

答案 0 :(得分:15)

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

如果您使用外部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

答案 1 :(得分: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    
)

答案 2 :(得分:1)

您可以尝试将GROUP BY t3.movie_id添加到第一个查询

答案 3 :(得分:0)

试试这个:

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

答案 4 :(得分:0)

MySQL 5.7+ 允许您使用 ANY_VALUE。 你没有提供完整的查询,所以我不得不猜测使用 xxx

SELECT xxx.id,ANY_VALUE(m.movie_name) movie_name, ANY_VALUE(popularity) popularity
FROM xxx
LEFT JOIN movies m ON (m.movie_name=xxx.movie_name AND popularity=0)
GROUP BY xxx.id

更多信息 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html