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

Yaslaw

n/a
Moderator
So, zurück in modernen Zeiten.
Dein Fehler ist klar. Du kannst kein UPDATE innerhalb eines SELECT machen. SELECT ist ein BEfehum und UPDATE auch.
In welcher Tabelle ist den wp_ihc_user_levels?

Übigens: Wo kann ich Dir für Deine Hilfe den 6-Päck hinschicken?
Danke, aber ich denke, das ist ein wenig zu teuer. Die Schweiz ist ausserhalb der EU:)
 

ChrisHaSaar

Grünschnabel
So, zurück in modernen Zeiten.
Willkommen zurück :)

Dein Fehler ist klar. Du kannst kein UPDATE innerhalb eines SELECT machen. SELECT ist ein BEfehum und UPDATE auch.
grins, da siehste mal, ich habe Deine Textbemerkungen scheinbar zu wörtlich genommen.

In welcher Tabelle ist den wp_ihc_user_levels?

Ah, mein Fehler: wp_ihc_user_levels ist ebenfalls eine Tabelle.
Danke, aber ich denke, das ist ein wenig zu teuer. Die Schweiz ist ausserhalb der EU:)
Ha, die Hälfte meiner Freude sind aus der Schweiz, einmal quer durch, also ich denke,
1. das bekäme ich hin
2. wäre es mir das Wert, da Deine Hilfe mir definitiv und anderen vielleicht einen Mehrwert bietet

Ich werd nachher einen Dump mit den entsprechenden Tabellen machen, muss nur noch die mittlerweile rund 1600 User "bearbeiten", die jetzt in der Plattform angemeldet sind.

Anbei auch mal die Strukturen der vier Tabellen (ich hoffe, ich habe keine vergessen):

wp_users -> diese Tabelle wird von Wordpress direkt angelegt
wp_users Struktur.jpg

wp_usermeta -> Hier befinden sich alle zusätzlich abgespeicherten Daten des Users (transponiert, also pro User 43 Datensätze)
wp_usermeta Struktur.jpg

wp_ihc_user_levels -> hier befinden sich die IDs der User-Levels (Abonnement bei Wordpress)
wp_ihc_user_levels Struktur.jpg

Hier nochmal die Aufschlüsselung der hier benötigten Levels:
Level 2 = zugehöriger Kunde
Level 4 = wenn nach Prüfung User nicht in Tabelle downline_report, dann bis zum nächsten Check Level 4
Level 6 = nach 2ter Prüfung User nicht in Tabelle downline_report, Auschluß von jeglichem Content
User-Level.jpg

Hier die downline_report-Tabelle, in die wöchentlich die Export-Datei der Kundenliste importiert wird, da Kunden dazukommen und andere ausgetragen sind. (Derzeit 240.000 Datensätze á 40 Spalten
downline-report Strukur (teilweise).jpg

Die beiden Pfeile signalisieren die Spalten, die ich benötige, die 03Position aber erst in nächsten Schritt.
Das sollte ich aber, wenn der Abgleich mit den Nummern steht, ja alleine hinbekommen... loool
 

ChrisHaSaar

Grünschnabel
Sorry für die Wartezeit, musste wegen meinem Weisheitszahn zum Zahnarzt... autschn...

Anbei hier die gezipte sql-Datei. Habe jetzt nur die 4 Files mit Mustereinträgen mitgeliefert.
 

Anhänge

  • bitnami_wordpress.zip
    7 KB · Aufrufe: 2

Yaslaw

n/a
Moderator
Versteh ich richtig, wp_ihc_user_levels soll angepasst werden.
Zum UPDATE in MySQL mit JOIN: MySQL UPDATE JOIN | Cross-Table Update in MySQL

Ich kann es erst am Abend mit deinem Dump testen. Hier im Büro habe ich keine MySQL-DB

SQL:
update
    -- Tabelle die den Update bekommt
    wp_ihc_user_levels ul
    -- Extrahierte tp_nummer, wird über die user_id verknüpft
    left join (
        select user_id, meta_value as tp_nummer
        from wp_usermeta
        WHERE meta_key = 'tp_nummer'  
    ) um
        on um.user_id = ul.user_id
    -- Die Reporttabelle, wird über die tp_nummer verknüpft
    left join downline_report dr
    on  um.tp_nummer = dr.01Customer_number
set
    -- Update-Datum setzen
    ul.update_time = now(),
    -- Level setzen
    ul.level_id = case
            -- nach 2ter Prüfung User nicht in Tabelle downline_report, Auschluß von jeglichem Content
            when dr.01Customer_number is null and ul.level_id = 4 then 6
            -- wenn nach Prüfung User nicht in Tabelle downline_report, dann bis zum nächsten Check Level 4
            when dr.01Customer_number is null then 4
            -- zugehöriger Kunde
            else 2
        end
-- nur solche nehmen, die nicht bereits auf 6 (Auschluß von jeglichem Content) sind
where ul.level_id <> 6;
 

ChrisHaSaar

Grünschnabel
Sorry für die späte Rückmeldung, war wegen Zahnschmerzen und -OP schon wieder außer Gefecht.

Erst einmal Deine Frage:
Ja, die wp_ihc_user_levels soll angepasst werden, richtig.
Feedback zum Code:

1634009345003.png


Die Abfrage funktioniert.
Einzig: immer dann, wenn jemand z.B. bereits weitere Level hat, Beispiel an einem User, der 2, 3 und 7 hat, dort werden alle Werte auf 2 umgeschrieben.

Siehe Beispiel aus folgender Ausgangslage:
User hat richtig:
1634009535301.png

Daraus wurde dann:
1634009566345.png


Hier nochmal die Level Tabelle mit den Leveln, die vergeben werden können:
Jeder kann mehrere Level haben, NUR Fremdstruktur löscht alle anderen Level

Member1
Vipteam Member2
Top Management3
Vipteam Hold4
Administration5
Fremdstruktur6
Zusatz-Event7

Bis hierher bin ich schon mega glücklich !!! Ich danke Dir von ganzem Herzen !!!!
 

Yaslaw

n/a
Moderator
Dann sollte der Status 2 gar nicht in diesem Update gesetzt werden? Dann nimm ihn einfach raus.
SQL:
    ul.level_id = case
            -- nach 2ter Prüfung User nicht in Tabelle downline_report, Auschluß von jeglichem Content
            when dr.01Customer_number is null and ul.level_id = 4 then 6
            -- wenn nach Prüfung User nicht in Tabelle downline_report, dann bis zum nächsten Check Level 4
            when dr.01Customer_number is null then 4
            -- zugehöriger Kunde
        end
Zur Performance. Setze saubere Indexe.
 

ChrisHaSaar

Grünschnabel
Danke vielmals für Deine Antwort und Mühe :)

Zur Frage:
Doch doch, der soll gesetzt werden. Wenn die User reinkommen, haben sie ja keinen Level.
Nur vorhandene Level dürfen nur dann überschrieben werden, wenn es Fremdstruktur ist. Ansonsten nicht.
Wenn wir also jemandem wie oben in dem Beispiel 2, 3, 7 gegeben haben, dann dürfen die 3 und die 7 nicht durch den Wert 2 überschrieben werden.

Zum Index:
Ich hatte Indexe gesetzt über Struktur. Muss mich mal schlau machen, ob es da eine smartere Lösung gibt.
Hab mir gestern durch Deine smarten Lösungen einen dicken Wälzer bestellt. Mal sehen, was ich daraus alles lerne... :)
 

Yaslaw

n/a
Moderator
Achso, jetzt sehe ich. Du hast mehrere Levels pro User. Uns interessieren aber nur die 2 und die 4 zum updaten.
Dann pass das WHERE an
SQL:
where ul.level_id in (2, 4);
 

ChrisHaSaar

Grünschnabel
Ja, mega, dann werde ich das gleich mal austesten.
Ich schicke Dir gleich mal eine PN
(Nein, es geht um keinen fachlichen Inhalt, deine Signatur sei respektiert. :D )
 

Neue Beiträge