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_name
aber 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 demHAVING
Klausel oder in derWHERE
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