提问人:Nate 提问时间:7/9/2012 最后编辑:Preet SanghaNate 更新时间:7/13/2022 访问量:104744
将左连接限制为返回一个结果?
Limiting a left join to returning one result?
问:
我目前有这个左连接作为查询的一部分:
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
我知道我问的问题有点模糊,因为我没有提供完整的查询,但我问的问题通常可能吗?
答:
37赞
Michael Berkowski
7/9/2012
#1
错误很明显 - 您只需要在子查询关闭后为子查询创建一个别名并在子句中使用它,因为每个表,无论是派生的还是实数的,都必须有自己的标识符。然后,您需要包含在子查询的选择列表中才能加入它。由于子查询已经包含 ,因此您不需要将其包含在 join 的子句中。)
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
更好地理解需求后更新:
要让每个组加入一个,您可以使用聚合或在子查询中对其进行分组。然后不需要子查询 -- 您将收到每个名称的第一个 with 或最后一个带有 .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赞
Nate
7/9/2012
非常感谢您的帮助。我重写了查询,使其与你的示例一样,它几乎可以工作,但并不完全是。如果我从语句中删除,那么它会像以前一样返回多个结果(电影名称),但是如果我留在查询中,则不会返回任何电影名称。知道为什么会这样吗?再次感谢。LIMIT 1
LIMIT 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
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
)
评论
LEFT JOIN ... ON ... AND ... LEFT JOIN ...
LIMIT 1
DISTINCT
LEFT JOIN
LIMIT 1