web-dev-qa-db-ja.com

左結合を1つの結果を返すように制限しますか?

私は現在、クエリの一部としてこの左結合を持っています:

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

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

8
Nate

エラーは明らかです。_)_を閉じた後にサブクエリのエイリアスを作成し、それを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_を介してそれを参照します。

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

参加するグループごとに1つを取得するには、_movie_id_で集計MAX()またはMIN()を使用し、それをサブクエリにグループ化します。その場合、サブクエリ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
_
17

最初のクエリにGROUP BY t3.movie_idを追加してみてください

1
i--

これを試して:

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
0
Preet Sangha
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    
)
0
Erik Olson