2017-07-18 13 views
-1

パフォーマンスの問題を引き起こすIN句を使用する以下のクエリで助けてください。私はそのためにJOINを使用したいが、そのようなクエリのためにどうやったらよいかわからない。mysql WHERE句でINの代わりにJOINを使用する方法

select * 
from user_followings 
where followed_id = 'xyz' AND owner_id IN (
    select DISTINCT owner_id 
    from feed_events 
    where DTYPE = 'PLAYLIST' AND last_updated_timestamp > '20-04-2017' AND (feed_type = 'PLAYED_PLAYLIST' OR feed_type = 'STARTED_LISTENING') 
    order by last_updated_timestamp DESC)"; 
+0

[Manual](https://dev.mysql.com/doc/refman/5.7/en/join.html)の例は役に立ちませんか? –

+0

あなた自身で試しましたか?あなたが直面している課題は何ですか? – money

+0

@moneyはい、私はここで試してみましたが、私の主な関心事は質問を得ることではありません。また、特定の要件のための節を選択する方法と、より速い応答形式のクエリを得るための最良のオプションを知りたいと思います。 – user2423768

答えて

1

私が参加使ってクエリを書き直し:

SELECT * 
    FROM user_followings 
    INNER JOIN feed_events ON user_followings.owner_id = feed_events.owner_id 
    WHERE followed_id = 'xyz' 
     AND DTYPE = 'PLAYLIST' 
     AND feed_events.last_updated_timestamp > '20-04-2017' 
     AND (
      feed_type = 'PLAYED_PLAYLIST' 
      OR feed_type = 'STARTED_LISTENING' 
      ) 
    ORDER BY last_updated_timestamp DESC 
+0

Daveさんにお問い合わせいただきありがとうございますが、 "Column 'last_updated_timestamp' where句があいまいです"というエラーが表示されます。 – user2423768

+0

こんにちは、私は私の答えを更新しました。 – Dave94

1

A joinはおそらく最善のアプローチではありません。 existsを使用します。

select uf.* 
from user_followings uf 
where uf.followed_id = 'xyz' and 
     exists (select 1 
       from feed_events fe 
       where uf.owner_id = fe.owner_id and 
        fe.DTYPE = 'PLAYLIST' and 
        fe.last_updated_timestamp > '2017-04-20' and 
        fe.feed_type in ('PLAYED_PLAYLIST', 'STARTED_LISTENING') 
      ); 

あなたがfeed_events(owner_id, dtype, last_updated_timestamp, feed_type)user_followings(followed_id, owner_id)のインデックスをしたいです。

その他の注意事項:

  • ORDER BY、このようなサブクエリでは役に立ちません。
  • 一定の日付に標準の日付形式(YYYY-MM-DD)を使用します。
  • ORの束の代わりにINを使用してください。ほとんどの状況で読みやすく、最適化が容易です。
+0

Gordonに感謝します。私はこの知識が私に役立つより複雑なクエリを作成する必要があります:) – user2423768

関連する問題