だから私は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
誰もがなぜ知っていますか?
質問に答えるには:そうではありません。 ON句のカラムがどのテーブルから来ているかを明示的に書いてください(例えば 'wp_terms.term_taxonomy_id')。あなたのGROUP BYステートメントは本当に奇妙で非効率的です。私はあなたが変数から値を入力していると思います。これが当てはまる場合は、この検索条件に入力値がないたびに 'post_title LIKE '%%'のようなものを使うのではなく、クエリを構築することをお勧めします。 –
私はテーブルのニックネームですべてを書き直しましたが(そして質問を更新しました)、それでも動作しませんでした。しかし、私に質問させてください。「あなたの質問を作成することをお勧めしますか? LIKE '%%'には検索入力で埋め込まれたPHP変数があるためです。しかし、私は本当に私のSQLクエリをより速くしたいです。 – mesqueeb
トピックはありませんが、SQLでのワイルドカード検索は非常に効率が悪いことに注意する価値があります.DBは一致するレコードを見つけるためにテーブル全体をスキャンする必要があります。複雑なクエリや大きなデータセットを取得した場合、クエリが非常に遅くなる可能性があります。あなたのDBに大量のデータが得られることを期待しているなら、 'LIKE '%...%''の構文の代わりに考えるべきです。代替案は一般的に設定するより多くの作業が必要ですが、コードのパフォーマンスを気にするならば十分な価値があります。 – Spudley