Kann nicht eine komplizierte mysql-Abfrage zu arbeiten

Ich bin versucht, zu schreiben, eine mysql-Abfrage und ich habe einige Probleme mit ihm. Ich versuche, die Abfrage WooCommerce Daten aus meinem Wordpress-Datenbank. Grundlegende Daten für die Rechnung gespeichert wird, in der wp_posts-Tabelle und der rest der Daten in die wp_postmeta-Tabelle. Jetzt 1 inovice in der wp_posts Tabelle-Punkte, um mehrere Einträge in der wp_postmeta Tabelle. Hier ist ein Beispiel.

WP_POSTS

----------------------------------------------------
ID STATUS Datum
----------------------------------------------------
0001 OPEN 01/01/2000
0002 ÖFFNEN 01/01/2000
0003 GESCHLOSSEN 01/02/2000

WP_POSTMETA

--------------------------------------------------------------------------
ID POST_ID META_KEY META_VALUE
--------------------------------------------------------------------------
0001 0001 CustomerLN Test
0002 0001 CustomerFN Tester
0003 0001 Payment_Type PayPal
0004 0001 Invoice_Total $200
0005 0002 CustomerLN Doe
0006 0002 CustomerFN John
0007 0002 Payment_Type CC-Mastercard
0008 0002 Invoice_Total $1000

Ich habe eine grundlegende Abfrage, die zieht die Daten aus der wp_posts-Tabelle, aber ich kann nicht herausfinden, wie Sie ziehen Daten aus der zweiten Tabelle auf der Basis der META_KEY Wert.

Jede Hilfe wäre toll. Vielen Dank im Voraus.

  • Ausgewählte Antwort
    peterm
    2. September 2013

    Willkommen in der Entity-Attribut-Wert - Welt.

    Eine normale Darstellung der Ergebnismenge, die Sie brauchen könnten, nicht nur JOIN diese beiden Tabellen aber auch PIVOT die Ergebnismenge. Dies können Sie mit einer Abfrage wie

    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
    

    Beispiel-Ausgabe:

    +------+--------+--------------------+--------------------+---------------+---------------+
    | id | status | customer_last_name | customer_firt_name | payment_type | invoice_total |
    +------+--------+--------------------+--------------------+---------------+---------------+
    | 1 | ÖFFNEN | Test | Tester | PayPal | $200 |
    | 2 | OPEN | Doe | John | CC-Mastercard | $1000 |
    | 3 | CLOSED | NULL | NULL | NULL | NULL |
    +------+--------+--------------------+--------------------+---------------+---------------+
    

    Hier ist SQLFiddle demo


    Nun werden in der Lage zu filtern von Datensätzen basierend auf meta-keys und meta-Werte, die Sie verwenden müssen HAVING - Klausel

    Zum Beispiel, wenn Sie möchten, bekommen Rechnungen von Kunden 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'
    

    Ausgabe:

    +------+--------+--------------------+---------------------+---------------+---------------+
    | id | status | customer_last_name | customer_first_name | payment_type | invoice_total |
    +------+--------+--------------------+---------------------+---------------+---------------+
    | 2 | OPEN | Doe | John | CC-Mastercard | $1000 |
    +------+--------+--------------------+---------------------+---------------+---------------+
    

    Hier ist SQLFiddle demo

3 Antworten

  • Scary Wombat
    2. September 2013

    Um zu beginnen, würde ich das tun

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

    Was haben Sie getan?

  • pfrank
    2. September 2013

    Für diesen Umstand Sie möchten, verwenden Sie "JOIN". Check-out http://www.w3schools.com/sql/sql_join.asp,, das ist fast genau das, was Sie tun möchten.

    Es werden am Ende so etwas wie:

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

    Beachten Sie auch, dass Ihre Tabelle-name ist falsch, für die zweite Tabelle.

  • tony gil
    31. Januar 2017

    Zunächst sollten Sie nicht versuchen, einen JOIN auf beide Tabellen, weil Ihre Tabellen-Strukturen sind unterschiedlich. Lassen Sie uns einen Blick, der verbraucht WP_POSTMETA's-Daten, Konsolidierung von it.

    Beitritt WP_POSTMETA mit sich selbst X-1 mal für alle X-Felder, die Sie interessiert sind, produziert von 0 bis X-Linien für jeden Post_ID. Verwenden Sie die WHERE - Klausel zu get 1 Spalte aus jeder Kopie der Tabelle und reduzieren Sie die Summe der Zeilen pro Post_ID zu 1 (oder keine).

    Filter aus dem Müll und voilà!

    HINWEIS: [table_name2] aufgerufen werden kann temp0, [table_name3], genannt temp1, [table_name4], genannt temp2, oder was auch immer Sie wünschen.

    SELECT WP_POSTMETA.Post_ID AS Post_ID, WP_POSTMETA.CustomerLN AS CustomerLN, [table_name2].CustomerFN AS  CustomerFN, [table_name3].Payment_Type AS Payment_Type, [table_name4].Meta_Value AS  Invoice_Total 
    FROM WP_POSTMETA 
    JOIN WP_POSTMETA AS [table_name2] ON WP_POSTMETA.Post_ID = [table_name2].Post_ID 
    JOIN WP_POSTMETA AS [table_name3] ON WP_POSTMETA.Post_ID = [table_name3].Post_ID 
    JOIN WP_POSTMETA AS [table_name4] ON WP_POSTMETA.Post_ID = [table_name4].Post_ID 
    WHERE WP_POSTMETA.Meta_Value =  "CustomerLN"
    AND [table_name2].Meta_Value =  "CustomerFN"
    AND [table_name3].Meta_Value =  "Payment_Type"
    AND [table_name4].Meta_Value =  "Invoice_Total"
    

    Dies erzeugt eine Ausgabe, die gemacht werden können in ein view vorangestellt

    CREATE VIEW WP_TRANSACTIONS AS
    

    und diese Ansicht JOINed WP_POST

    SELECT * FROM WP_POST 
    LEFT JOIN WP_TRANSACTIONS ON WP_POST.Post_ID = WP_TRANSACTIONS.Post_ID