タイプcar
の投稿ごとに1行の結果セットを取得しようとしているようです。 。投稿に各車のさまざまな属性を表示したいようですが、それらはpostmeta
に隠されています。 。
プロのヒント:決して SELECT *
を使用します なぜそれをしているのかを完全に理解していない限り、ソフトウェアで。特に、多くのJOIN
を含むクエリの場合 操作、SELECT *
無意味で冗長な列をたくさん返します。
WordPressのpostmeta
について知っておくべきクエリデザインのトリックがあります テーブル。特定の属性を取得する場合は、次のようにします。
SELECT p.ID, p.post_title,
color.meta_value AS color
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS color ON p.ID = color.post_id AND 'color' = color.meta_key
WHERE p.post_status = 'publish'
AND /* etc etc */
あなたがやろうとしていることをするとき、このパターンを理解することは非常に重要です。 postmeta
のため、このパターンが必要です は、key-value
と呼ばれる特殊なタイプのテーブルです。 または
- このパターンを使用すると、投稿ごとに1行を取得し、
posts
からいくつかの列を取得します。 テーブルとpostmeta
の特定の属性 テーブル。 - あなたは
LEFT JOIN
postmeta
を使用する テーブルなので、属性が欠落している場合でも行を取得できます。 -
postmeta
のエイリアス名を使用しています テーブル。これがpostmeta AS color
です 。 -
meta_key
のセレクターを含めています (ここでは'color' = color.meta_key
)ON
参加の条件。 -
SELECT
でエイリアスを使用していますpostmeta.meta_value
を提示する句 適切な列名を持つアイテム。これがcolor.meta_value AS color
です 。
このパターンの採用に慣れたら、LEFT JOIN
のカスケードを使用してパターンを積み重ねることができます。 操作、そのように多くの異なる属性を取得します。
SELECT wp_posts.ID, wp_posts.post_title, wp_posts.whatever,
color.meta_value AS color,
transmission.meta_value AS transmission,
model.meta_value AS model,
brand.meta_value AS brand
FROM wp_posts
LEFT JOIN wp_postmeta AS color
ON wp_posts.ID = color.post_id AND color.meta_key='color'
LEFT JOIN wp_postmeta AS transmission
ON wp_posts.ID = transmission.post_id AND transmission.meta_key='transmission'
LEFT JOIN wp_postmeta AS model
ON wp_posts.ID = model.post_id AND model.meta_key='model'
LEFT JOIN wp_postmeta AS brand
ON wp_posts.ID = brand.post_id AND brand.meta_key='brand'
WHERE wp_posts.post_status = 'publish'
AND wp_posts.post_type = 'car'
ORDER BY wp_posts.post_title
パターンを見やすくするために、このクエリにたくさんのインデントを加えました。別のインデントスタイルをお勧めします。
質問のクエリでパフォーマンスの問題が発生した理由を理解するのは困難です。これは、すべてのINNER JOIN
との組み合わせ爆発が発生したことが原因である可能性があります。 その後、フィルタリングされた操作。しかし、いずれにせよ、あなたが示したクエリはおそらく行を返さなかったでしょう。
それでもパフォーマンスの問題が発生する場合は、postmeta
に複合インデックスを作成してみてください (post_id, meta_key, meta_value)
列。 WordPressプラグインを作成している場合、それはおそらくプラグインのインストール時に行う作業です。