15

現在、クエリの一部としてこの左結合があります。

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

2 番目のクエリは次のエラーで終了します。

Every derived table must have its own alias

完全なクエリを提供していないため、私が求めていることは少し曖昧であることはわかっていますが、私が求めていることは一般的に可能ですか?

4

6 に答える 6

28

エラーは明らかです。サブクエリを閉じた後にサブクエリのエイリアスを作成し、)それを句で使用するだけで済みます。これは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

これらの列のいずれかをouterで使用している場合は、たとえばSELECT経由で参照してください。the_alias.movie_name

要件をよりよく理解した後に更新します。

結合するグループごとに 1 つを取得するには、集計を使用する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
于 2012-07-09T02:30:42.193 に答える
2

GROUP BY t3.movie_id最初のクエリに追加しようとすることができます

于 2012-07-09T02:37:40.020 に答える
1

これを試して:

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
于 2012-07-09T02:30:54.533 に答える