3

mysql クエリを作成しようとしていますが、問題が発生しています。Wordpress データベースから WooCommerce データをクエリしようとしています。基本的な請求書データは wp_posts テーブルに保存され、残りのデータは wp_postmeta テーブルに保存されます。wp_posts テーブルの 1 つの inovice が wp_postmeta テーブルの複数のアイテムを指すようになりました。ここに例があります。

WP_POSTS

-------------------------------------------------- --
ID ステータス 日付
-------------------------------------------------- --
0001 OPEN 2000/01/01
0002 OPEN 2000/01/01
0003 閉店 2000/01/02

WP_POSTMETA

-------------------------------------------------- ------------------------
ID POST_ID META_KEY META_VALUE
-------------------------------------------------- ------------------------
0001 0001 CustomerLN テスト
0002 0001 CustomerFN テスター
0003 0001 Payment_Type ペイパル
0004 0001 Invoice_Total $200
0005 0002 CustomerLN ドウ
0006 0002 CustomerFN ジョン
0007 0002 Payment_Type CC-Mastercard
0008 0002 Invoice_Total $1000

wp_posts テーブルからデータを取得する基本的なクエリがありますが、META_KEY 値に基づいて 2 番目のテーブルからデータを取得する方法がわかりません。

どんな助けでも素晴らしいでしょう。前もって感謝します。

4

4 に答える 4

2

まず、私はそうします

select a.*, b.* from WP_POSTS a, wp_postmeta b
where b.POST_ID = a.id

あなたは何をした?

于 2013-09-02T02:37:16.180 に答える
2

この状況では、「JOIN」を使用します。http://www.w3schools.com/sql/sql_join.aspを確認してください。これは、まさにあなたがやりたいことです。

次のように終了します。

SELECT *
FROM wp_posts
INNER JOIN wp_postmeta
ON wp_posts.ID=wp_postmeta.PostId;

また、2 番目のテーブルのテーブル名が間違っていることに注意してください。

于 2013-09-02T02:37:53.537 に答える
1

エンティティー属性値の世界へようこそ。

結果セットを正常に表現するには、JOINこれら 2 つのテーブルだけでなくPIVOT、結果セットも必要になる場合があります。次のようなクエリでそれを行うことができます

SELECT p.id, p.status,
       MAX(CASE WHEN m.meta_key = 'CustomerLN'    
                THEN m.meta_value END) customer_last_name,
       MAX(CASE WHEN m.meta_key = 'CustomerFN'    
                THEN m.meta_value END) customer_firt_name,
       MAX(CASE WHEN m.meta_key = 'Payment_Type'  
                THEN m.meta_value END) payment_type,
       MAX(CASE WHEN m.meta_key = 'Invoice_Total' 
                THEN m.meta_value END) invoice_total
 FROM wp_posts p LEFT JOIN wp_postmeta m
   ON p.id = m.post_id
 GROUP BY p.id, p.status

出力例:

+--------+--------+--------------------+------------ ------+---------------+---------------+
| | ID | ステータス | customer_last_name | customer_first_name | お支払い方法 | 請求書合計 |
+--------+--------+--------------------+------------ ------+---------------+---------------+
| | 1 | 開く | テスト | テスト テスター | ペイパル | $200 |
| | 2 | 開く | ドウ | ドウ | ジョン | CCマスターカード | $1000 |
| | 3 | 閉店 | ヌル | ヌル | ヌル | ヌル |
+--------+--------+--------------------+------------ ------+---------------+---------------+

これがSQLFiddleのデモです


HAVINGメタ キーとメタ値に基づいてレコードをフィルタリングできるようにするには、句を使用する必要があります。

たとえば、顧客の Jhon Doe が作成した請求書を取得する場合

SELECT p.id, p.status,
       MAX(CASE WHEN m.meta_key = 'CustomerLN'    
                THEN m.meta_value END) customer_last_name,
       MAX(CASE WHEN m.meta_key = 'CustomerFN'    
                THEN m.meta_value END) customer_first_name,
       MAX(CASE WHEN m.meta_key = 'Payment_Type'  
                THEN m.meta_value END) payment_type,
       MAX(CASE WHEN m.meta_key = 'Invoice_Total' 
                THEN m.meta_value END) invoice_total
 FROM wp_posts p LEFT JOIN wp_postmeta m
   ON p.id = m.post_id
 GROUP BY p.id, p.status
HAVING customer_last_name = 'Doe'
   AND customer_first_name = 'John'

出力:

+--------+--------+--------------------+------------ ------+---------------+---------------+
| | ID | ステータス | customer_last_name | 顧客名 | お支払い方法 | 請求書合計 |
+--------+--------+--------------------+------------ ------+---------------+---------------+
| | 2 | 開く | ドウ | ドウ | ジョン | CCマスターカード | $1000 |
+--------+--------+--------------------+------------ ------+---------------+---------------+

これがSQLFiddleのデモです

于 2013-09-02T03:14:03.253 に答える