WordPress SQL fragt den Vor- und Nachnamen des Benutzers für Produkt X ab?

Lesezeit: 8 Minuten

Benutzer-Avatar
Ava Barbilla

Ich erstelle eine SQL-Abfrage, in der ich die vollständigen Namen und E-Mail-Adressen von Kunden anzeigen möchte, die ein herunterladbares Produkt in einem Woocommerce-Shop gekauft haben. Ich suche sowas:

user_id    first_name    last_name    user_email    order
---------------------------------------------------------
1          Peter         Jones        a12@gmail     Doc_1

In der obigen Tabelle Dokument_1 steht für den Namen des Produkts, in diesem Fall des Kunden mit user_id = 1 herunterladen kann Dokument_1. Für WordPress-Benutzer wissen Sie, dass die Tabelle wp_usermeta enthält alle Informationen des Benutzers und sieht so aus:

umeta_id    user_id    meta_key    meta_value
---------------------------------------------
1           1          nickname    petjon123
2           1          first_name  Peter
3           1          last_name   Jones
...         ...        ...         ...

Diese Liste geht nach unten und enthält mehr meta_value[s] inkl. E-Mail etc. Alles wäre viel einfacher gewesen, wenn das gewesen wäre meta_key[s] würden Tabellenüberschriften angezeigt first_name und last_name nebeneinander statt übereinander. Ich bin so weit gekommen, wo meine Abfrage das zeigt first_nameaber ich habe Probleme, die zu bekommen last_name. Meine SQL-Abfrage sieht so aus:

SELECT
  wp_usermeta.user_id,
  wp_usermeta.meta_value AS 'first_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email AS 'email',
  Wp_woocommerce_order_items_1.order_item_name AS 'order'
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     (Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = wp_usermeta.user_id
GROUP BY wp_usermeta.user_id,
         wp_usermeta.meta_value,
         Wp_woocommerce_downloadable_product_permissions_1.user_email,
         Wp_woocommerce_order_items_1.order_item_name,
         Wp_woocommerce_order_items_1.order_item_type,
         wp_usermeta.meta_key
HAVING (((Wp_woocommerce_order_items_1.order_item_type) = 'line_item')
AND ((wp_usermeta.meta_key) = 'first_name'));

Gib mir dieses Ergebnis:

user_id    first_name    user_email    order
--------------------------------------------
1          Peter         a12@gmail     Doc_1

Ich habe diese Werte manuell überprüft, und sie sind korrekt, aber ich muss sagen, wenn ich es nicht tue GRUPPE die ergebnisse, ich bekomme 1000 mal mehr ergebnisse, also GRUPPIERUNG Die Daten vereinfachen die Ergebnisse, indem sie im Wesentlichen die Duplikate entfernen, was offensichtlich übertrieben ist. Ich bezweifle, dass diese Abfrage effizient ist, da die Ausführungszeit bis zum Erscheinen der Ergebnisse +/- beträgt20368,14 ms und hiermit bin ich sehr offen für Vorschläge zur Verbesserung dieses Codes. Nachdem dies gesagt wurde, dachte ich, dass ich eine weitere Abfrage durchführen müsste, um die zu erhalten last_name macht dies a VERSCHACHTELTE ABFRAGE. Wenn ich die Tabellen in MS Access öffne, erstellen Sie sagen wir mal Abfrage1 Das ist die obige Abfrage, und beitreten Abfrage1 Mit der Tabelle bekomme ich die Ergebnisse, die ich will. Der SQL-Code dafür lautet wie folgt:

SELECT
  Query1.user_id,
  Query1.first_name,
  wp_usermeta.meta_value AS 'last_name',
  Query1.user_email,
  Query1.order_item_name
FROM wp_usermeta
INNER JOIN Query1
  ON wp_usermeta.user_id = Query1.user_id
WHERE (((wp_usermeta.meta_value) <> '')
AND ((wp_usermeta.meta_key) = 'last_name'));

Ich habe versucht zu ersetzen Abfrage1 für diese zweite Abfrage unter Verwendung von Klammern, indem Sie den Code von einschließen Abfrage1, und das hat nicht funktioniert. Ich bekomme diesen Fehler:

Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von ‘.user_id’ (SELECT wp_usermeta.user_id, wp_usermeta.meta_value AS ‘first’ in Zeile 22

Weiß jemand, wie das geht? Vielen Dank!!


AKTUALISIEREN

Laut der Antwort von @Hogan habe ich mir Folgendes ausgedacht:

SELECT
  first.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email,
  Wp_woocommerce_order_items_1.order_item_name
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     wp_usermeta AS last
     INNER JOIN ((Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta AS first
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = first.user_id)
       ON last.user_id = Wp_woocommerce_downloadable_product_permissions_1.user_id
GROUP BY first.user_id,
         first.meta_value,
         last.meta_value,
         Wp_woocommerce_downloadable_product_permissions_1.user_email,
         Wp_woocommerce_order_items_1.order_item_name,
         Wp_woocommerce_order_items_1.order_item_type,
         first.meta_key,
         last.meta_key
HAVING (((Wp_woocommerce_order_items_1.order_item_type) = 'line_item')
AND ((first.meta_key) = 'first_name')
AND ((last.meta_key) = 'last_name'));

Was in MS Access einwandfrei funktioniert, in SQL jedoch nicht. Ich bekomme diesen Fehler:

Unbekannte Spalte „first.meta_key“ in „having-Klausel“

Wieso den?

Ich muss auch erwähnen, dass wenn ich die hinzufüge meta_key[s] zum SELECT so was:

SELECT
  first.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email,
  Wp_woocommerce_order_items_1.order_item_name,
  first.meta_key,
  last.meta_key

Ich bekomme zumindest keinen Fehler, die Abfrage läuft, aber sie geht weiter und erhöht meine CPU-Auslastung drastisch, da ich auf einem lokalen Host arbeite.


LÖSUNG

SELECT DISTINCT hat es geschafft. Nein GRUPPIERUNG. Die Abfrageergebnisse erscheinen in 127,76 ms. Dies ist meine Abfrage:

SELECT DISTINCT
  first.user_id AS 'id',
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email AS 'email',
  Wp_woocommerce_order_items_1.order_item_name AS 'order'
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     ((Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta AS first
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = first.user_id)
     INNER JOIN wp_usermeta AS last
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = last.user_id
WHERE (((first.meta_key) = 'first_name')
AND ((last.meta_key) = 'last_name')
AND ((Wp_woocommerce_order_items_1.order_item_type) = 'line_item'));

Wie @Hogan sagte, fügen Sie einfach die Tabelle hinzu wp_usermeta wieder mit einem anderen Alias, und machen Sie eine INNER JOIN.

  • Abgesehen davon geht Ihre Abfrage davon aus, dass alle Metaschlüssel ausgefüllt sind. Dies mag für Dinge wie Vorname und Nachname zutreffen, aber möglicherweise nicht für andere Metaschlüssel – in diesem Fall wird ein INNER JOIN diesen Kunden weglassen und stattdessen ein OUTER JOIN verwendet werden.

    – Erdbeere

    3. Mai 2016 um 6:39 Uhr

  • Diese sehen nicht wie meine Abfragen aus. Ich habe nie gesetzt first.meta_key = 'first_name' in dem HAVING Klausel oder in der WHERE oder zwischen so vielen Klammern. Entfernen Sie ernsthaft alle Klammern, das ist keine Algebra, sie spielen keine Rolle. Fügen Sie diese wie ich in den Join ein, es wird Ihre Abfrage schneller und klarer machen.

    – Hogan

    3. Mai 2016 um 16:07 Uhr

  • @ Hogan Okay. So werde ich es machen. Danke für Ihre Hilfe!

    – Ava Barbilla

    5. Mai 2016 um 12:34 Uhr

Benutzer-Avatar
Aaron Dietz

Versuche dies:

SELECT DISTINCT
  pp.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  pp.user_email AS 'email',
  oi.order_item_name AS 'order'
FROM
  Wp_woocommerce_order_items oi
INNER JOIN
  Wp_woocommerce_downloadable_product_permissions pp ON pp.order_id = oi.order_id
INNER JOIN
  wp_usermeta first ON first.user_id = pp.user_id
INNER JOIN
  wp_usermeta last ON last.user_id = pp.user_id
WHERE first.meta_key = 'first_name'
AND last.meta_key = 'last_name'
AND oi.order_item_type="line_item"

  • Ich habe den Code in My Web SQL eingefügt und es hat nicht funktioniert. Ich erhalte: Unbekannte Spalte „wo.order_item_name“ in „field list“

    – Ava Barbilla

    2. Mai 2016 um 22:22 Uhr


  • @AvaBarbilla Hoppla, falscher Alias. Behoben, aber es sieht so aus, als hättest du es zum Laufen gebracht 😀

    – Aaron Dietz

    3. Mai 2016 um 14:10 Uhr

diesen Join hinzufügen

INNER JOIN wp_usermeta AS last 
    ON Wp_woocommerce_downloadable_product_permissions_1.user_id = last.user_id AND last.meta_key = 'last_name'

und die Säule

last.meta_value AS 'last_name',

Sie müssen wahrscheinlich nicht so verrückt werden mit dem () — Die Reihenfolge spielt keine Rolle, es sei denn, Sie führen eine Unterabfrage durch (was nicht der Fall ist) oder mischen linke und rechte Joins (was nicht der Fall ist).

  • Danke für die schnelle Antwort. Wo füge ich diesen Code hinzu? Ich bekomme ständig Syntaxfehler. Könnten Sie die ganze Abfrage bereitstellen, damit ich einen Überblick habe? Noch einmal vielen Dank 🙂

    – Ava Barbilla

    2. Mai 2016 um 19:46 Uhr

  • Ich habe kein MySQL, um meine Syntax zu testen, und hier ist ein Feuer aufgetaucht – ich werde es in ein paar Minuten versuchen, wenn ich diese 1,6 Millionen fehlenden Zeilen finden kann.

    – Hogan

    2. Mai 2016 um 19:50 Uhr

  • @AvaBarbilla sieht aus, als hätte Aaron D dich abgedeckt.

    – Hogan

    2. Mai 2016 um 21:17 Uhr

1353110cookie-checkWordPress SQL fragt den Vor- und Nachnamen des Benutzers für Produkt X ab?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy