2012-02-20 6 views
0

私はSQLクエリーを作成するためにCREATE VIEWとエイリアシングに頼ってきましたが、もっと効率的な方法があると確信しています。誰でも一般的なアドバイスを提供できますか?ここに私の最新の醜態です:CREATE VIEWに基づいて長いSQLクエリを減らすには?

SELECT associations2.object_id, associations2.term_id, associations2.cat_ID, associations2.term_taxonomy_id 
FROM (SELECT objects_tags.object_id, objects_tags.term_id, wp_cb_tags2cats.cat_ID, categories.term_taxonomy_id 
    FROM (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id, wp_term_taxonomy.term_taxonomy_id 
     FROM wp_term_relationships 
     LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id 
     ORDER BY object_id ASC, term_id ASC) 
     AS objects_tags 
    LEFT JOIN wp_cb_tags2cats ON objects_tags.term_id = wp_cb_tags2cats.tag_ID 
    LEFT JOIN (SELECT wp_term_relationships.object_id, wp_term_taxonomy.term_id as cat_ID, wp_term_taxonomy.term_taxonomy_id 
     FROM wp_term_relationships 
     LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id 
     WHERE wp_term_taxonomy.taxonomy = 'category' 
     GROUP BY object_id, cat_ID, term_taxonomy_id 
     ORDER BY object_id, cat_ID, term_taxonomy_id) 
     AS categories on wp_cb_tags2cats.cat_ID = categories.term_id 
    WHERE objects_tags.term_id = wp_cb_tags2cats.tag_ID 
    GROUP BY object_id, term_id, cat_ID, term_taxonomy_id 
    ORDER BY object_id ASC, term_id ASC, cat_ID ASC) 
    AS associations2 
LEFT JOIN categories ON associations2.object_id = categories.object_id 
WHERE associations2.cat_ID <> categories.cat_ID 
GROUP BY object_id, term_id, cat_ID, term_taxonomy_id 
ORDER BY object_id, term_id, cat_ID, term_taxonomy_id 
+0

サブセレクト内の「order by」句は効果がありません。重要な唯一の「order by」は最後のものです。また、「グループ化」句を取り除くことができるかどうかも疑問です。集約関数を使用しているようではないので、これらで達成しようとしていることがわかりません。あなたは "カテゴリ"の別名を付けた副選択を持っていますが、 "カテゴリ"というテーブルもあるようです。私はそれがあなたが尋ねたものではないことを知っていますが、これは物事を非常に混乱させます。 (...続き...) –

+0

最後に、wp_term_relationshipsとwp_term_taxonomyに複数の結合があるようです。おそらくこれを行う必要はありませんが、私はこのクエリが何を達成しようとしているのか分からないので、私が言うのは難しいです。 –

答えて

2

エイリアシングを使用するように結合し、異なる種類のより良い方法にいくつかの研究を行った後、私のSQLコードがはるかに凝縮され、(実行する時間はかかりません)効率的。答えは2つありました。適切なJOINメソッドを使用して、返される行数を減らしてください。 - INNER JOINは、ほとんどの場合に特に役に立ちました(http://www.w3schools.com/sql/sql_join_inner.aspを参照)。複数の列で同じテーブルを結合するには別名を使用します。

私が以前にやっていたことは、データを返し、そのデータを他の基準に基づいてフィルタリングするために、基本的に4つまたは5つのビュー(CREATE VIEWを使用)を作成していたためです。たとえば、「CREATE VIEW view 1 AS SELECT」文を使用して行a、b、c、dを返し、「SELECT a FROM view1 WHERE criterion」文を使用してデータをフィルタ処理していました。時にはこれを複数回繰り返しました。

同じタスクを実行するより効率的な方法は、エイリアシングを使用して同じテーブルで複数のJOINを使用することでした。ほとんどのクエリでINNER JOINと組み合わせると、クエリ時間が大幅に短縮され、より複雑なステートメントと同じ行が返されました。

例:

SELECT * 
FROM table1 
INNER JOIN table2 AS alias1 
    ON table1.col1 = alias1.col1 
INNER JOIN table2 AS alias2 
    ON table1.col2 = alias2.col2 
WHERE col2 = 'some_condition' 

この方法は、命の恩人となっています。

関連する問題