INNER JOIN
s をs に変更することをお勧めしますLEFT JOIN
。 INNER JOIN
結合の左側のテーブルに一致するものがない場合、行を削除します。
ON
次のように、句を括弧で再キャストすることもできます。
INNER JOIN wp_term_taxonomy ttpa
ON ( ttpa.taxonomy='pa_pa'
AND ttpa.term_taxonomy_id=relationships.term_taxonomy_id)
編集
GROUP BY
この条項はどのような目的に役立ちますか? あなたは、混乱を招く非標準のMySQL拡張機能をGROUP BY
. これを読んで理解してくださいGROUP BY
。http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html 真剣に。
クエリでは 3 つのことが行われているようです。この問題をトラブルシューティングする機会があれば、これを慎重に分析する必要があります。これを正しく機能させるために、 Structured in Structured Query Languageを使用してみましょう。
まず、特定の投稿 (あなたの場合は販売アイテム) を含む結果セットを取得しようとしています。
SELECT p.id, p.post_title, p.guid
FROM wp_posts p
WHERE p.post_status = 'publish'
AND post_type = 'product'
このクエリは適切なアイテムのリストを生成しますか? 価格設定されていないアイテムなどが含まれている場合がありますが、少なくともリストに必要なすべてのアイテムが含まれている必要があります。
次に、製品投稿の分類情報 (カテゴリ、キーワードなど) を取得して表示しようとしています。これは、そのようなものを取得するクエリです (私はあなたのアプリケーションのこの部分を理解していません)。あなたが取り出そうとしている分類学の分野は 2 つあると思います。これは典型的な WordPress タクソノミー ルックアップ ヘアボールです。それらの1つはこれです:
SELECT tr.object_id AS id,
t.name AS mozrank
FROM wp_term_relationships AS tr
INNER JOIN wp_term_taxonomy AS x
ON (x.taxonomy='pa_mozrank'
AND x.term_taxonomy_id=tr.term_taxonomy_id)
INNER JOIN wp_terms AS t
ON t.term_id=x.term_id
このクエリをテストします。「pa_mozrank」タクソノミーに分類されたすべての投稿の行を提供し、そのタクソノミーの投稿 ID と mozrank 値を示します。このクエリが機能することを確認してください。そうでない場合は、それを理解してください。これを理解して動作させるまで先に進まないでください。
クエリが pa_pa 階層から値をフェッチする場合も同様です。
SELECT tr.object_id AS id,
t.name AS pa
FROM wp_term_relationships AS tr
INNER JOIN wp_term_taxonomy AS x
ON (x.taxonomy='pa_pa'
AND x.term_taxonomy_id=tr.term_taxonomy_id)
INNER JOIN wp_terms AS t
ON t.term_id=x.term_id
3 番目に、 から特定の属性を取得していますpost_meta
。投稿と価格、投稿と在庫状況についても同様のものが必要です。繰り返しますが、これらのクエリを作成し、個別にデバッグします。価格はこちら。
SELECT post_id AS id, meta_value AS price
FROM wp_postmeta
WHERE meta_key = `_regular_price'
在庫状況はこちら。
SELECT post_id AS id, meta_value AS stockstatus
FROM wp_postmeta
WHERE meta_key = `_stock_status'
良い: デバッグされたサブクエリが 5 つあります。それぞれに索引が付けられていid
ます。
- 公開された製品投稿のリスト
- すべての投稿とその pa_mozrank 分類のリスト。
- すべての投稿とその pa_pa 分類のリスト。
- 価格。
- 仕入れ状況。
次に、これらすべてのものを結合する必要があります。最後のクエリの概要は次のとおりです。おそらく、これが元のクエリとどのように関連しているかがわかります。
SELECT whatever
FROM wp_posts AS p
LEFT JOIN (mozranks) AS mo ON p.id = mo.id
LEFT JOIN (pas) AS pa ON p.id = pa.id
LEFT JOIN (prices) AS pr ON p.id = pr.id
LEFT JOIN (stockstatus) AS ss ON p.id = ss.id
WHERE p.post_status = 'publish'
AND p.post_type = 'product'
AND pr.price <> ''
AND ss.stockstatus = 'instock'
ここで LEFT JOIN を使用しているのは、一部またはすべての属性が欠落している場合でも wp_posts テーブルからのデータが必要なためです。
最後に、すべてをまとめると、かなり巨大なクエリが得られます。しかし、すべての部分が単体テストされたクエリが得られます。だから、額を叩いてWTFと言う必要はありませんか?なんてこと?クエリを作成するこの段階で。
SELECT whatever
FROM wp_posts AS p
LEFT JOIN (
SELECT tr.object_id AS id,
t.name AS mozrank
FROM wp_term_relationships AS tr
INNER JOIN wp_term_taxonomy AS x
ON (x.taxonomy='pa_mozrank'
AND x.term_taxonomy_id=tr.term_taxonomy_id)
INNER JOIN wp_terms AS t
ON t.term_id=x.term_id
) AS mo ON p.id = mo.id
LEFT JOIN (
SELECT tr.object_id AS id,
t.name AS pa
FROM wp_term_relationships AS tr
INNER JOIN wp_term_taxonomy AS x
ON (x.taxonomy='pa_pa'
AND x.term_taxonomy_id=tr.term_taxonomy_id)
INNER JOIN wp_terms AS t
ON t.term_id=x.term_id
) AS pa ON p.id = pa.id
LEFT JOIN (
SELECT post_id AS id, meta_value AS price
FROM wp_postmeta
WHERE meta_key = `_regular_price'
) AS pr ON p.id = pr.id
LEFT JOIN (
SELECT post_id AS id, meta_value AS stockstatus
FROM wp_postmeta
WHERE meta_key = `_stock_status'
) AS ss ON p.id = ss.id
WHERE p.post_status = 'publish'
AND p.post_type = 'product'
AND pr.price <> ''
AND ss.stockstatus = 'instock'
これは長いクエリですが、非常に簡単にまとめられていることがわかり、パーツを 1 つずつデバッグできます。
クエリオプティマイザは、このようなことを可能な限り効率的にするように設計されているため、何百万もの商品を販売している場合を除いて、心配する必要はありません。 .
大企業でこれを行っているエンタープライズ開発者であれば、サブクエリに SQL ビューを使用するかもしれません。(Oracle または PostgreSQL を使用している場合はWITH
、クエリで句を使用できます。) WordPress でこれを行うこともできますが、アクティブ化と非アクティブ化でそれらを作成および削除するプラグインを作成することをお勧めします。大規模な SQL クエリを使用するだけの方が簡単な場合があります。