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

Limiting a left join to returning one result?

提问人:Nate 提问时间:7/9/2012 最后编辑:Preet SanghaNate 更新时间:7/13/2022 访问量:104744

问:

我目前有这个左连接作为查询的一部分:

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

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

综上所述,我想将左连接的结果限制为 1。

我试过了这个:

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

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

php mysql join 左联接

评论

1赞 jay 7/9/2012
那是最后一个左连接,对吧?你不会去吧?在你的陈述的末尾,难道不是你所追求的吗?LEFT JOIN ... ON ... AND ... LEFT JOIN ...LIMIT 1
1赞 golja 7/9/2012
看看声明,也许可以解决你的问题。DISTINCT
1赞 Nate 7/9/2012
@jared - 这是查询中的最后一个,是的。在它之前还有两个。但是,我不能只停留在最后,因为整个查询会返回许多行。LEFT JOINLIMIT 1
0赞 Saghachi 12/29/2021
这回答了你的问题吗?MySQL JOIN 仅最近一行?
0赞 philipxy 6/7/2022
这回答了你的问题吗?提取具有列的 Max 值的行

答:

37赞 Michael Berkowski 7/9/2012 #1

错误很明显 - 您只需要在子查询关闭后为子查询创建一个别名并在子句中使用它,因为每个表,无论是派生的还是实数的,都必须有自己的标识符。然后,您需要包含在子查询的选择列表中才能加入它。由于子查询已经包含 ,因此您不需要将其包含在 join 的子句中。)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

更好地理解需求后更新:

要让每个组加入一个,您可以使用聚合或在子查询中对其进行分组。然后不需要子查询 -- 您将收到每个名称的第一个 with 或最后一个带有 .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

评论

1赞 Nate 7/9/2012
非常感谢您的帮助。我重写了查询,使其与你的示例一样,它几乎可以工作,但并不完全是。如果我从语句中删除,那么它会像以前一样返回多个结果(电影名称),但是如果我留在查询中,则不会返回任何电影名称。知道为什么会这样吗?再次感谢。LIMIT 1LIMIT 1
1赞 Michael Berkowski 7/9/2012
@Nate 这有点奇怪。我放了一个明确的(应该在那里),但我认为这不是原因。ORDER BY
1赞 Michael Berkowski 7/9/2012
@Nate 单独运行子查询,并验证它是否返回包含您拥有的 WHERE 子句的正确行。
1赞 Michael Berkowski 7/9/2012
@Nate,你的MySQL版本是什么?旧版本不支持子查询,尽管它至少从 5.0 开始工作。LIMIT
2赞 Nate 7/9/2012
先生,您是个天才!它工作得很好!我想现在我应该尝试真正了解它是如何工作的:-)谢谢!
1赞 Preet Sangha 7/9/2012 #2

试试这个:

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
2赞 i-- 7/9/2012 #3

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

10赞 Erik Olson 8/23/2019 #4
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赞 oriadam 12/22/2020 #5

在MySQL 5.7+上,使用:ANY_VALUE & GROUP_BY

SELECT t1.id,t1.movie_name, ANY_VALUE(t3.popularity) popularity
FROM t1
LEFT JOIN t3 ON (t3.movie_id=t1.movie_id AND t3.popularity=0)
GROUP BY t1.id

更多信息 LEFT JOIN only first row

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

-1赞 Saghachi 12/28/2021 #6

左联接 1 个最近/最不近的行的简单解决方案是使用 select over ON 短语

SELECT A.ID, A.Name, B.Content
FROM A
LEFT JOIN B
ON A.id = (SELECT MAX(id) FROM B WHERE id = A.id)

其中 A.id 是自动增量主键。

评论

0赞 FiruzzZ 3/22/2023
你不能在子查询中使用 A,postgres ''' ERROR: invalid reference to FROM clause entry for table “A” SQL state: 42P01 提示:表“A”有一个条目,但不能从查询的这一部分引用它。
-2赞 Sonu Chohan 6/7/2022 #7
// Mysql

SELECT SUM(db.item_sales_nsv) as total FROM app_product_hqsales_otc as db 
LEFT JOIN app_item_target_otc as it ON 
db.id = (SELECT MAX(id) FROM app_item_target_otc  as ot WHERE id = db.id) 
and db.head_quarter = it.hqcode 
AND db.aaina_item_code = it.aaina_item_code AND db.month = it.month 
AND db.year = it.year
WHERE db.head_quarter = 'WIN001' AND db.month = '5' AND db.year = '2022' AND db.status = '1' 
0赞 QeiNui 7/13/2022 #8
LEFT JOIN (
  SELECT id,movie_name FROM movies GROUP BY id
) as m ON (
   m.id = x.id 
)