1

私は過去 6 時間この問題に取り組んできたので、ここで助けを求めることにしました。

私の目標は、データベース内のすべての製品をサイトのページに表示することです。製品はドメイン名であり、それぞれに表示する必要がある属性があります。

私はかなり困惑しています、これが私がこれまでに得たものです:

SELECT p.id, p.post_title, p.guid, 
       meta_price.meta_value as price, 
       mozrank.name as mozrank, 
       pa.name as pa 
  FROM wp_posts p 
 INNER JOIN wp_postmeta meta_price ON p.id=meta_price.post_id 
            AND meta_price.meta_key='_regular_price' 
 INNER JOIN wp_postmeta meta_instock ON p.id=meta_instock.post_id 
            AND meta_instock.meta_key='_stock_status' 
 INNER JOIN wp_term_relationships relationships ON p.id=relationships.object_id 
 INNER JOIN wp_term_taxonomy ttmozrank ON ttmozrank.taxonomy='pa_mozrank' 
            AND ttmozrank.term_taxonomy_id=relationships.term_taxonomy_id 
 INNER JOIN wp_terms mozrank ON mozrank.term_id=ttmozrank.term_id 
 INNER JOIN wp_term_taxonomy ttpa ON ttpa.taxonomy='pa_pa' 
            AND ttpa.term_taxonomy_id=relationships.term_taxonomy_id 
 INNER JOIN wp_terms pa ON pa.term_id=ttpa.term_id 
  WHERE p.post_status = 'publish' 
    AND post_type = 'product' 
    AND meta_price.meta_value<>''
    AND meta_instock.meta_value = 'instock'
  GROUP BY p.id

このブロックを削除すると、MySQL は必要なものを出力しますが、1 つの属性に対してのみ出力します。

        INNER JOIN wp_term_taxonomy ttpa ON ttpa.taxonomy='pa_pa' 
            AND ttpa.term_taxonomy_id=relationships.term_taxonomy_id 
        INNER JOIN wp_terms pa ON pa.term_id=ttpa.term_id 

表示したい属性がいくつかあります: item-number、pa、da、mozrank、backlinks、refering-domains、tf、cf。

助けていただければ幸いです:)

編集:テーブル構造

wp_terms

  • term_id
  • 名前

wp_term_taxonomy

  • term_taxonomy_id
  • term_id
  • 分類法

wp_term_relationships

  • object_id
  • term_taxonomy_id

wp_postmeta

  • post_id
  • メタ ID
  • メタキー
  • メタ値
4

2 に答える 2

5

INNER JOINs をs に変更することをお勧めしますLEFT JOININNER 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 BYhttp://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ます。

  1. 公開された製品投稿のリスト
  2. すべての投稿とその pa_mozrank 分類のリスト。
  3. すべての投稿とその pa_pa 分類のリスト。
  4. 価格。
  5. 仕入れ状況。

次に、これらすべてのものを結合する必要があります。最後のクエリの概要は次のとおりです。おそらく、これが元のクエリとどのように関連しているかがわかります。

   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 クエリを使用するだけの方が簡単な場合があります。

于 2013-09-22T18:06:38.820 に答える