0

奇妙なSQLクエリに問題があります。MySQL を使用していて、データベース構造を変更したいのですが、できません。だから私はクエリで私の問題を解決しなければなりません。

だから私は3つのテーブルを持っています。Challenges、Users_challenges、Users_subscribed。私がそこから抜け出すために必要なもの 3 は次のとおりです。

challenge.private = 0 のすべてのチャレンジのリストが必要で、現在のユーザー ID (users_challenges.iduser = 414) の下の Users_challenges に表示されるすべてのチャレンジを除外する必要があります。次に、challenges.private = 1 または 0 を持つことができる課題が必要ですが、それらは 3 番目のテーブル (users_subscribed.iduser = 414) にリストされており、ここでもすべての読み取り ID を課題テーブルから除外する必要があります。最後に、すべての結果をまとめて、時間と制限で並べ替える必要があります。

少なくとも私にとってはかなり紛らわしいので、それが正しいことを願っています:D

現在のクエリの実行には 26 秒かかります。

SELECT *
FROM challenges
WHERE challenges.private = 0
AND challenges.isquest = 1
AND challenges.title like '%%'
AND challenges.id NOT
IN (
        SELECT users_challenges.idchallenge
        FROM users_challenges
        WHERE users_challenges.iduser = 414
        AND users_challenges.idquest IS NULL
        GROUP BY users_challenges.idchallenge
)

UNION

SELECT *
FROM challenges
WHERE challenges.isquest = 1
AND challenges.title like '%%'
AND challenges.iduser
IN (
                SELECT users_subscriptions.idsubscribedto
                FROM users_subscriptions
                WHERE users_subscriptions.iduser = 414
                UNION
                SELECT 414 AS idsubscribedto
)
AND challenges.id NOT
IN (
        SELECT users_challenges.idchallenge
        FROM users_challenges
        WHERE users_challenges.iduser
        IN (
                SELECT users_subscriptions.idsubscribedto
                FROM users_subscriptions
                WHERE users_subscriptions.iduser = 414
                UNION
                SELECT 414 AS idsubscribedto
        )
        AND users_challenges.idquest IS NULL
        GROUP BY users_challenges.idchallenge
)

ORDER BY TIME DESC
LIMIT 0,30

このクエリを簡素化し、同じ結果をより速く得る方法はありますか? どうも

4

1 に答える 1

0

がタイプミスでない場合and challenges.title like '%%'は、最初のステップとしてこれを削除します。これは常に正しいためです。

Rewriting Subqueries as Joinsによると、の代わりに結合を使用する方が有益な場合がありin (subquery)ます。

2 つのクエリを別々に実行して、そのうちの 1 つだけが遅いかどうかを確認することもできます。次に、遅い部分に集中し、速い部分はそのままにしておきます。

于 2012-11-30T17:12:16.467 に答える