2016-03-19 17 views
0

だから私はLEFT JOINの順序に応じてバナナに行くクエリがあります。 しかし、なぜ私は分からない!MySQLでLEFT JOINの順序が重要なのはなぜですか?

ここでは、正しい結果の完全なクエリです。注意:postmetaはbeginnigに参加したままになりました。

SELECT SQL_CALC_FOUND_ROWS wpp.ID 
    ,post_title 
    ,terms.NAME AS category 
    ,terms.slug AS slug 
    ,GROUP_CONCAT(terms.slug SEPARATOR ', ') AS allslug 
    ,GROUP_CONCAT(postmeta.meta_value SEPARATOR ', ') AS allmetavalues 
FROM wp_posts AS wpp 
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id 
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id 
LEFT JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id 
GROUP BY wpp.ID 
HAVING (
     post_title LIKE '%%' 
     OR allslug LIKE '%%' 
     OR allmetavalues LIKE '%%' 
     ) 
    AND (allslug LIKE '%gifts-toys-and-animation%') 
ORDER BY post_date DESC LIMIT 20 OFFSET 0 

私は次の順序でLEFT JOIN年代を書く場合 - 最後でpostmeta - それは私に何も結果を与えて停止します。

LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id 
LEFT JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id 
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id 

誰もがなぜ知っていますか?

+1

質問に答えるには:そうではありません。 ON句のカラムがどのテーブルから来ているかを明示的に書いてください(例えば 'wp_terms.term_taxonomy_id')。あなたのGROUP BYステートメントは本当に奇妙で非効率的です。私はあなたが変数から値を入力していると思います。これが当てはまる場合は、この検索条件に入力値がないたびに 'post_title LIKE '%%'のようなものを使うのではなく、クエリを構築することをお勧めします。 –

+0

私はテーブルのニックネームですべてを書き直しましたが(そして質問を更新しました)、それでも動作しませんでした。しかし、私に質問させてください。「あなたの質問を作成することをお勧めしますか? LIKE '%%'には検索入力で埋め込まれたPHP変数があるためです。しかし、私は本当に私のSQLクエリをより速くしたいです。 – mesqueeb

+0

トピックはありませんが、SQLでのワイルドカード検索は非常に効率が悪いことに注意する価値があります.DBは一致するレコードを見つけるためにテーブル全体をスキャンする必要があります。複雑なクエリや大きなデータセットを取得した場合、クエリが非常に遅くなる可能性があります。あなたのDBに大量のデータが得られることを期待しているなら、 'LIKE '%...%''の構文の代わりに考えるべきです。代替案は一般的に設定するより多くの作業が必要ですが、コードのパフォーマンスを気にするならば十分な価値があります。 – Spudley

答えて

0

実際に定義される前に、term_linkの列を参照するため、2番目の列を使用すると、結果は得られませんが、エラーです。

+0

あなたが正しいです、私は質問を定式化したときにコピーの貼り間違いがありました。しかしもう一度見てください。私は質問を編集しました:それは今書いている方法で私に0の結果を与えます。エラーでもない... – mesqueeb

関連する問題