{"id":646,"date":"2017-08-30T05:50:44","date_gmt":"2017-08-30T03:50:44","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=646"},"modified":"2017-08-30T05:50:44","modified_gmt":"2017-08-30T03:50:44","slug":"die-bessere-alternative-zum-zigfachen-join-kreuztabelle","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/08\/30\/die-bessere-alternative-zum-zigfachen-join-kreuztabelle\/","title":{"rendered":"Die bessere Alternative zum -zigfachen Join: Kreuztabelle"},"content":{"rendered":"<p>Also, zuerst mal dieses: ich habe versucht herauszufinden, ob MySQL Kreuztabellen (Pivot Tables) kann oder nicht, und die Tendenz beim Googlen geht zu eher nicht. Jedenfalls gibt es keinen Transform-Befehl, man mu\u00df sich da irgendwie anders behelfen.<\/p>\n<p>Ich habe da die tollsten Konstrukte gefunden, <a href=\"https:\/\/stackoverflow.com\/questions\/7674786\/mysql-pivot-table\">hier ein besonders H\u00fcbsches<\/a> mit einem Case f\u00fcr jedes Feld&#8230; na, das ist ja wohl nicht der Weisheit letzter Schlu\u00df. Da greife ich doch lieber auf meine Leib- und Magendatenbank zur\u00fcck, n\u00e4mlich Microsoft Access. Ich bin ja sonst kein Microsoft-Fan, aber das gute alte Access ist einfach eine tolle Datenbank mit einem sagenhaften Bedienkomfort im Entwurfsmodus.\u00a0Auch wenn die zugrundeliegende Jet-Engine schon viele Jahre auf dem Buckel hat, im intuitiven Zusammenstellen aller m\u00f6glichen Arten von Abfragen ist Access echt ungeschlagen.<\/p>\n<h2>Was wollen wir erreichen?<\/h2>\n<p>Wir haben ja im letzten Artikel gesehen, da\u00df wooCommerce zu jeder Bestellung mindestens 48 Eintr\u00e4ge in der wp_postmeta anlegt. Ich h\u00e4tte jetzt gerne einen tabellarischen \u00dcberblick \u00fcber alle Bestellungen, mit allen 48 Werten aus der wp_postmeta\u00a0zu jeder Bestellung.<\/p>\n<p>Das hei\u00dft im Klartext: eine Tabelle mit den relevanten Daten aus der wp_posts, und allen 48 Meta Keys als Felder in einer Zeile. Auf jeden Fall brauchen wir einen Join von der wp_posts auf die wp_postmeta \u00fcber die ID der Bestellung, und dann noch die Meta Keys als Feldnamen, bef\u00fcllt mit den Meta Values. Klingt schaurig kompliziert, ist aber in Access relativ einfach machbar, n\u00e4mlich mit einer <strong>Kreuztabelle<\/strong>.<\/p>\n<h2>Der SQL f\u00fcr die Kreuztabelle<\/h2>\n<p>&#8230;sieht so aus:<\/p>\n<p><strong>TRANSFORM<\/strong> First(postmeta_alle_orders.meta_value) AS ErsterWertvonmeta_value<br \/>\nSELECT postmeta_alle_orders.post_id, postmeta_alle_orders.post_title, postmeta_alle_orders.post_status, postmeta_alle_orders.post_type<br \/>\nFROM postmeta_alle_orders<br \/>\nGROUP BY postmeta_alle_orders.post_id, postmeta_alle_orders.post_title, postmeta_alle_orders.post_status, postmeta_alle_orders.post_type<br \/>\n<strong>PIVOT<\/strong> postmeta_alle_orders.meta_key;<\/p>\n<p>Den kann man sich mit Hiilfe des Kreuztabellen-Assistenten erstellen und dann im Entwurfsmodus komfortabel editieren.<\/p>\n<h2>Das Ergebnis der Kreuztabelle<\/h2>\n<p>Ich habs mal schnell der \u00dcbersichtlichkeit halber in ein Formular gepackt (auch hierf\u00fcr hat Access einen prima Assistenten), da sieht dann z.B. unser Datensatz mit der Nummer 42 so aus:<\/p>\n<div id=\"attachment_649\" style=\"width: 682px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-649\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-649\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/formular_kreuztabelle-1.jpg\" alt=\"formular_kreuztabelle\" width=\"672\" height=\"601\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/formular_kreuztabelle-1.jpg 672w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/formular_kreuztabelle-1-300x268.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2017\/08\/formular_kreuztabelle-1-624x558.jpg 624w\" sizes=\"(max-width: 672px) 100vw, 672px\" \/><p id=\"caption-attachment-649\" class=\"wp-caption-text\">formular_kreuztabelle<\/p><\/div>\n<p>Na, da hat man wenigstens mal alle Felder im Blick. Wenn man jetzt noch w\u00fc\u00dfte, f\u00fcr was die alle gut sind&#8230; aber da lasse ich jeden selber raten, anhand der Feldnamen m\u00fc\u00dfte man da relativ weit kommen.<\/p>\n<h2>Wie kann man es \u00fcbersichtlicher machen?<\/h2>\n<p>Wir haben jetzt wenigstens ein bi\u00dfchen\u00a0den \u00dcberblick gewonnen, mit 7 Zeilen Jet-SQL statt 48 mal Join und Case. Die Krux ist halt, dass es von vorne herein ein Unding ist, einem Datensatz so viele Werte redundant zuzuordnen.<\/p>\n<p>Wenn sie nur mal die vielen Felder anschauen, die etwas mit Adressen zu tun haben, die geh\u00f6ren ausgelagert! Da geh\u00f6rt ein Fremdschl\u00fcssel auf die Kundennummer rein, und zu den Kunden-Basisdaten in einer eigenen Tabelle\u00a0legen wir uns noch eine schnuckelige zweite Tabelle mit Rechnungsadresse und Lieferadresse (falls abweichend) des Kunden an, das wars dann und ist sauber gel\u00f6st.,<\/p>\n<p>Damit k\u00f6nnen die ganzen Adressfelder aus den Bestellungen rausfliegen, das macht so \u00fcber den Daumen gepeilt schon mal etwas mehr als 20 Felder weniger. Genauso sieht es mit den Zahlungsmodalit\u00e4ten und den Steuerinformationen aus, auch die geh\u00f6ren normalisiert und ausgelagert, das w\u00e4ren dann noch mal ein rundes Dutzend Felder weniger.<\/p>\n<p>Aber&#8230; die wooCommerce-Entwickler wissen ja anscheinend nicht, wie man Daten normalisiert und Detailtabellen anlegt, deshalb dieser un\u00fcberschaubare Datenwust. Das ist einfach nur grottenschlecht programmiert, da bei\u00dft die Maus kein Faden ab. Es kann sich ja jeder selber \u00fcberlegen, wie ein sauberes Datenmodell f\u00fcr die Bestellungen aussehen k\u00f6nnte, so als Finger\u00fcbung zum Entspannen \ud83d\ude09<\/p>\n<p>Ich mach hier mal Schlu\u00df, und \u00fcberleg mir ein neues Thema. See you demn\u00e4chst, ich w\u00fcnsche gute Erholung vom wooCommerce-Datenchaos!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Also, zuerst mal dieses: ich habe versucht herauszufinden, ob MySQL Kreuztabellen (Pivot Tables) kann oder nicht, und die Tendenz beim Googlen geht zu eher nicht. Jedenfalls gibt es keinen Transform-Befehl, man mu\u00df sich da irgendwie anders behelfen. Ich habe da die tollsten Konstrukte gefunden, hier ein besonders H\u00fcbsches mit einem Case f\u00fcr jedes Feld&#8230; na, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[27,7,3,24],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/646"}],"collection":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/comments?post=646"}],"version-history":[{"count":2,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/646\/revisions"}],"predecessor-version":[{"id":650,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/646\/revisions\/650"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=646"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}