MySQL: Gültigkeitsabfrage über 3 Tabellen hinweg (eine davon mit Metadaten der User)

ChrisHaSaar

Grünschnabel
Ich grüße Euch... :)

Ich habe eine Herausforderung, die ich, weil ich seit über 10 Jahren "raus" aus der Materie bin, als einfache "Wenn Dann" Abfragen nicht hinbekomme.

Die Situation:
Mein Kollege hat einen Wordpress-Blog installiert, in dem zum Test gut 900 von etwa 122.000 Benutzer werkeln, alle seine Vertriebler.
Die Company hat es zur Auflage gemacht, dass wirklich nur seine Vertriebler aus wettbewerbsgründen dort Zugang haben.
Das soll über die Vertriebler-ID (tp_nummer), die bei der Registrierung eingegeben werden muss, geregelt werden.
Diese Nummern werden wöchentlich aus dem Rechner der Company exportiert und in die Datenbank in eine neue Tabelle `downline_report` importiert werden.
Drei Tabellen sind für das, was ich brauche, wichtig:

`wp_users` = Hier werden von Wordpress die User-ID (Primery) definiert
`wp_usermeta` = Hier werden die Vertriebler-IDs gespeichert, die die User bei der Registration eingeben
`downline_report` = Hier ist die Importdatei der Company. 122.000 Datensätzen in 80 Spalten.

Die Tabelle `wp_usermeta` ist leider keine herkömmliche Tabelle, denn dort wird alles als Meta-Daten der User gespeichert, in transponierter Reihenfolge. :( und das macht es für mich so nervig, die Abfragen zu verknüpfen.

Hier die kleine Übersicht der Daten, die ich brauche:

Tabelle 1 = wp_usersTabelle 2 = wp_usermetaTabelle 3 = downline_report
IDuser_id01Customer_number
meta_key = tp_nummer03Position
meta_value = 66706 (z.B.)
(Vertriebler-ID)

Damit ihr Euch ein Bild machen könnt:

Tabelle 1 Abfrage:
1632861635970.png


Tabelle 2 Abfrage:
1632861015136.png



(die importierte) Tabelle 3 Abfrage:
1632861349357.png

Im Grunde ist es recht einfach:

Wenn der neue User sich registriert, soll in der Tabelle `downline_report` geschaut werden, ob diese '01Customer_number' dort eingetragen ist.
Wenn ja, dann update die Spalte `level_id` in der Tabelle `wp_ihc_user_levels` mit dem Wert "2".
(gleichbedeutend mit Abonnement/Level: "Eigenes Team")

Wenn nein, dann update die Spalte `level_id` in der Tabelle `wp_ihc_user_levels` mit dem Wert "4".
(gleichbedeutend mit Abonnement/Level: "Hold")

Ich bin wirklich aufgeschmissen, seit gut 1 Woche gern 13, 14 Std. am Tag befasse ich mich damit, habe gefühlte 3000 Tutorials hinter mir, doch es klappt nicht.
Ich bin mit meiner Weissheit am Ende.

Das Ganze muss ich dann einmal komplett durchlaufen lassen, was mich dann zum nächsten Problem bringt:
Diese blöde wp_usermeta, bei der ich mehrere Parameter brauche, um den richtige Wert anzuzeigen, will mir einfach ne Suche nicht erlauben.

Vorzugsweise soll die funktionierende Abfrage dann in php eingefasst werden, damit sie nach dem Registrierungsprozess gleich ausgeführt wird, somit brauche ich nach dem erfolgreichen Abgleich dann nur noch die wöchentlich diejenigen zu prüfen, die den Wert "2" in der Tabelle `wp_ihc_user_levels` bekommen haben.

Ist die "wp_usermeta.meta_key = tp_nummer" als "downline_report.01Customer_number" vorhanden, wird in der Tabelle `wp_ihc_user_levels` mit dem Wert "2" (Eigenes Team) versehen, ansonsten endgültiger Wechsel in die "6" (Fremdstruktur).

Konntet Ihr mir folgen?

Eigentlich ganz einfach:
1. wenn tp_nummer in downline_report.01Customer_number steht, dann alles gut, Level "Eigenes Team"
2. wenn nicht, dann Level "Hold" bis zum nächsten Abgleich in einer Woche, wenn drin, dann 1., wenn nein, dann Level "Fremdstruktur".

Ach, das mit der Posiion können wir erstmal lassen. Denn da muss ihc dann den Wert ebenfalls in der Meta-.Datei abgleichen und berichtigen, da einige Vertriebler im Rang steigen. Bei verschiedenen Rängen gibts dann auch anderen Content.

Wenn ich wenigstens erst einmal die SQL-Befehle habe, den Rest schaffe ich dann wieder.
Ich bin mir sicher, ich hatte die Lösung schon, aber echt, ich bin durch... :D

Danke schön jetzt für Die Mühe, Dir das durchzulesen.
Noch mehr Dank, wenn Du mir dann auch helfen kannst. Der nächste 6-Pack geht auf mich! Ehrensache... :D
 
Zuletzt bearbeitet:

Yaslaw

n/a
Moderator
Ich habe die Anforderungen nicht ganz verstanden, aber ich glaube, du suchst so etwas
SQL:
-- muss noch in ein UPDATE gequetscht werden
select
    case 
        when not dr.01Customer_number is null
        then 2  -- eigenes Team
        when not um.tp_nummer is null
        then 6 
        else 4
    end as level
from 
    (select tp_nummer:= 66076 as tp_nummer) vars
    left join downline_report dr on vars.tp_nummer = dr.01Customer_number
    left join (
        select meta_value as tp_nummer, user_id 
        from wp_usermeta
        where meta_key = 'tp_nummer'
    ) um on vars.tp_nummer = um.meta_value
 

ChrisHaSaar

Grünschnabel
Wow, danke, ich habe gar nicht so schnell mit einer Reaktion gerechnet.
Ich danke Dir, das werde ich gleich mal ausprobieren und Meldung erstatten. :)
 
Zuletzt bearbeitet:

ChrisHaSaar

Grünschnabel
Ah, ich sehe gerade:
Du schreibst "(select tp_nummer:= 66076 as tp_nummer) vars"

Diese 66076 ist bereits eine der tp_nummern, die als Wert in der wp_usermeta steht, weiss ich jetzt garnicht, wie ich das mit 900 Nummern mache...

Sorry, ich sagte ja, ich bin raus aus dem Thema und fühl mich wie ein blutiger Anfänger :eek:
 

Yaslaw

n/a
Moderator
Gegenfrage. Woher hast du die 900 Nummern die du prüfen musst?

Das (select tp_nummer:= 66076 as tp_nummer) vars dient nur dazu, dass man die Nummer nicht überall in den WHERE schreiben muss. Ist also eine imaginäre Tabelle mit einem Feld und einem Inhalt.
 
Zuletzt bearbeitet:

ChrisHaSaar

Grünschnabel
Also, die bisher 900 eingetragenen User sind die en Block eingeladenen Vertriebskunden (insgesamt rund 122.000) meines Kollegen. Wir haben besprochen, dass wir nicht alle auf einmal einladen, sondern immer 1000, um Verbesserungen, Änderungen "in Ruhe" machen zu können. Wenn Die Bude voll ist auf der Plattform, ist das schon schwieriger.
Diese komplette Kundenliste mit den 122.000 Kunden wurde von ihm in eine CSV-Tabelle exportiert und wird hier in die Tabelle downline_report hochgeladen.

Leider schummeln sich aber immer wieder Kunden und Partner anderer Kollegen dazu, die gem. der Richtlinien der Firma nicht betreut werden dürfen. (Kundenschutz).
und diese müssen durch die Kundennummer geprüft und vom Content ferngehalten werden.
 

Yaslaw

n/a
Moderator
Also sind diese 900 Nummern in irgend einer Tabelle drin. Dann kannst du den Subselect durch diese Tabelle ersetzen
SQL:
-- Alles in <> durch die richtigen Namen/Texte ersetzen
...
from    
    (
        select tp_nummer 
        from <my_table_with_uploades_tp_nummer>
        where <filterfeld> = '<filtervalue>'
    ) vars
    left join ...
 

ChrisHaSaar

Grünschnabel
Genau, und das ist mein Problem. Sie sind durch ein PlugIn in der Tabelle wp_usermeta gespeichert. Diese speichert die Daten der User nicht in einer Zeile und vielen Spalten, sondern in einer Spalte und vielen Zeilen.
Genau das ist es aber, was ich nicht hinbekomme. Ich habe für einen User 43 Zeilen/Datensätze.

Ich habe gut 2 Tage gebraucht um zu verstehen, wie ich mir die Daten anzeigen lasse. Siehe Code unten.
Aber sie in eine Anfrage zu verpacken, da bin ich einfach nicht mehr in der Lage, ich muss es auch mir selbst zugestehen.
Das jetzt in den obigen Code einzugeben habe ich nicht geschafft.
Ich bitte hier höflichst um weitere Hilfe, wenn das möglich wäre,,,

SQL:
SELECT
    wp_usermeta.user_id,
    wp_usermeta.meta_key,
    wp_usermeta.meta_value
FROM
    `wp_usermeta`
WHERE
    user_id     = '2'
AND
    meta_key    = 'tp_nummer'
AND
    meta_value  = '66076';
 

Yaslaw

n/a
Moderator
Hm.. ich dachte du willst prüfen ob die ID in der usermeta vorhanden ist. Aber in dem Fall ist das die Basis mit der Auswahl. Dann hat aber meta_value = '66076' im WHERE nix verloren.

Mit dem folgenden SQL extrahierst du mal alle tp_nummern aus der usermeta
SQL:
select meta_value as tp_nummer, user_id 
from wp_usermeta
where meta_key = 'tp_nummer'

Das ist in dem Fall die Basis. Dieser mit einem LEFT JOIN die downline_reportanhängen um zu sehen ob da ein Eintrag existiert.
Code:
select
    case 
        when not dr.01Customer_number is null
        then 2  -- eigenes Team
        else 4
    end as level
from 
    (
        select meta_value as tp_nummer, user_id 
        from wp_usermeta
        where meta_key = 'tp_nummer'
    ) um    
    left join downline_report dr on um.tp_nummer = dr.01Customer_number

Wenn das auch falsch ist, solltest du mal Beispieldaten liefern. Ich m uss zugeben, dass ich mehr verwirrt bin als zu beginn. Irgendwie wiederspricht sich alles.

PS: Ich bin ab Morgen Mittag bis Dienstag offline
 

ChrisHaSaar

Grünschnabel
Nee, ich glaube, das sollte hinhauen.
Nochmals echt tauuuuusend Dank für Dein Hirnschmalz, so langsam verstehe ich dann auch wieder, wo was wann und warum.
Bis auf eines, einzeln klappt das jetzt alles, allerdings hab ich nen Klopper drin beim Einfügen der beiden Updates:
SQL:
select
    case
        when not dr.01Customer_number is null
        then
            UPDATE `wp_ihc_user_levels` SET `level_id` = "2"
        else
            UPDATE `wp_ihc_user_levels` SET `level_id` = "4"
    end as level
from
    (
select
    user_id, meta_value as tp_nummer
FROM
    wp_usermeta
WHERE
    meta_key = 'tp_nummer'  
    ) um  
        left join
            downline_report dr
        on  
            um.tp_nummer = dr.01Customer_number

In Zeile 5, 6, 7 und 8 zeigt er mir nen Fehler an, ich verstehe aber ehrlich gesagt nicht, was ich vergessen habe.
Ich denke, Du lachst erst einmal über meine Doofheit... Mit Recht, aber es hat etwas Gutes:
Es fängt wieder an, mir Spaß zu machen und Dank Dir und Deinen Code-Zeilen, habe ich wieder Spaß daran gefunden. Es nagt wieder, wenn ich etwas nicht hinbekomme, deshalb hat es so lange gedauert, bis ich mich zurück melde, ich wollte es unbedingt selbst hinbekommen...

Übigens: Wo kann ich Dir für Deine Hilfe den 6-Päck hinschicken?