我目前将此左连接作为查询的一部分:
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
我知道我问的是有点模糊,因为我没有提供完整的查询,但我一般都会问这个问题吗?
答案 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