Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Abfrageergbnis weiterverarbeiten

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Tja_was, 24 November 2016.

  1. Tja_was

    Tja_was Neuer Benutzer

    Hallo,
    ich versuche jetzt seit Wochen verzweifelt eine Lösung für mein Problem zu finden..
    Ich habe in meiner Datenbank eine Tabelle "post_meta". In dieser befinden sich 4 Spalten. in einer Spalte befinden sich Angaben wie Datum, Name, etc. Ich schaffe es die gewünschten Daten zu Filtern und erhalte im Grunde schon ein zufriedenstellendes Ergebnis. ABER:
    Wie kann ich aus diesem Ergebnis weiter Filtern? Sprich ich bekomme im Moment den Kundennamen, Kundenkontakt und ein Erinnerungsdatum. Ich möchte eine Email mit den entsprechenden Daten ausgehend vom Erinnerungsdatum - 100 Tage. Leider kann ich es nicht weiter filtern.

    Hier mal einer meiner vielen Ansätze:
    $sql= "meta_value, post_id FROM di0n8s_postmeta WHERE meta_key='name' OR meta_key='kontakt' OR meta_key='start-datum' OR meta_key='befuellung-neu' ORDER BY post_id";
    $suchdatum = new DateTime("-100 days");
    echo $suchdatum->format("d-m-Y");

    Nur wie bekomme ich das kombiniert oder muss ich mit create temporary table arbeiten?

    Ich hoffe ich konnte mich einigermaßen Verständlich ausdrücken.. ;-)

    Über jede Hilfe bin ich dankbar. Google hab ich auch schon befragt, aber mir fehlt einfach der Ansatz..

    Gruß,
    Tanja
     
  2. drdimitri

    drdimitri Datenbank-Guru

    Einfach mit der richtigen Klammerung:
    Code:
    Select ... from tabelle where (spalte1='xy' or spalte1='ab') and spalte3>datumAb
    Statt der OR Verknüpfung kannst auch
    Code:
    spalte1 IN('ab','xy') schreiben. Ist übersichtlicher bewirkt aber das gleiche.
     
  3. Tja_was

    Tja_was Neuer Benutzer

    Vielen Dank erst mal für die schnelle Antwort..

    Das war auch ein Ansatz - hat aber leider auch nicht so funktioniert wie ich wollte..
    Zur Vereinfachung ist hier mal ein Teil der Tabelle:

    meta_id post_id meta_key meta_value

    9214 2449 _name field_5640b7c8bc98b
    9215 2449 kontakt 0177-3398382
    9218 2449 _start-datum field_559b4ed315caa
    9219 2449 befuellung-neu power-sterilisator
    9205 2449 _shipping_first_name NULL
    9204 2449 _billing_country DE
    9203 2449 _billing_postcode 80997
    9202 2449 _billing_city München
    9201 2449 _billing_address_2
    9199 2449 _billing_company test@vilmo.de
    9200 2449 _billing_address_1 Test Str. 52
    9198 2449 _billing_last_name Testnachname
    9197 2449 _billing_first_name Testvorname
    9195 2449 _fax
    9196 2449 _account_type customer
    9194 2449 _phone 0177-3398382
    9193 2449 _account_owner 3
    9192 2449 _edit_last 3
    9220 2449 _befuellung-neu field_559b4f3d15cab
    9217 2449 start-datum 03-11-2016
    9216 2449 _kontakt field_5640b7debc98c
    9213 2449 name Testvorname Testnachname
    9212 2449 _shipping_country NULL
    9211 2449 _shipping_postcode NULL
    9209 2449 _shipping_address_2 NULL
    9210 2449 _shipping_city NULL
    9208 2449 _shipping_address_1 NULL
    9207 2449 _shipping_company NULL
    9206 2449 _shipping_last_name NULL
    9191 2449 _edit_lock 1478275743:3

    Ich brauch im Grunde nur die Daten, deren Datum 100 Tage bei "befuellung-neu='power-sterilisator'" oder 200 Tage bei "befuellung-neu='conditioner'" zurückliegt..

    Auch das war ein Ansatz:
    $suchdatum = new DateTime("-100 days");
    echo $suchdatum->format("d-m-Y"); (Ergebnis: 16-08-2016 - wäre ja richtig in der Formatierung)
    $query = "SELECT meta_value, post_id FROM wb16_postmeta WHERE meta_key='start-datum'AND DATEDIFF(NOW(), 'post_date') > 11";

    Funktioniert leider auch nicht.. Wo ist denn nur mein Denkfehler?
     
  4. Tja_was

    Tja_was Neuer Benutzer

    Hier die Tabelle als Bild - ist besser lesbar.. ;-)

    tabelle.jpg
     
  5. Tja_was

    Tja_was Neuer Benutzer

    Wenn ich versuche das Ganze gleich nach Datum zu durchsuchen:

    $suchdatum = new DateTime("-100 days");
    echo $suchdatum->format("d-m-Y");
    $query = "SELECT meta_value, post_id FROM wb16_postmeta WHERE meta_key='start-datum' LIKE '$suchdatum'";

    erhalte ich folgende Fehlermeldung:
    Catchable fatal error: Object of class DateTime could not be converted to string

    Hilfe, ich steh so auf der Leitung..
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Was Du machst nennt sich EAV-Modell - und ist unhandlich abzufragen, wie Du grade merkst. Simples Beispiel:

    Code:
    test=*# select * from eav_daten ;
    artikel |  key  |  value  
    ---------+-------+------------
      47 | farbe | rot
      47 | datum | 2016-11-24
      47 | preis | 12
      56 | farbe | gelb
      56 | datum | 2016-12-01
      56 | preis | 25
    (6 rows)
    
    Man kann das besser darstellen wenn man mit JSON-Daten arbeitet:

    Code:
    test=*# select * from json_daten ;
    artikel |  data  
    ---------+---------------------------------------------------------
      47 | {"datum": "2016-11-24", "farbe": "rot", "preis": "12"}
      56 | {"datum": "2016-12-01", "farbe": "gelb", "preis": "25"}
    (2 rows)
    
    Die Tabelle dazu sieht so aus, inklusive einem Index:

    Code:
    test=*# \d json_daten
      Table "public.json_daten"
    Column  |  Type  | Modifiers
    ---------+---------+-----------
    artikel | integer | not null
    data  | jsonb  |
    Indexes:
      "json_daten_pkey" PRIMARY KEY, btree (artikel)
      "json_index" gin (data jsonb_path_ops)
    
    Und ein Select darauf kann via Index - Suche ablaufen und ist recht simpel:

    Code:
    test=*# explain select * from json_daten where data @> '{"farbe": "gelb"}' and data @> '{"preis": "25"}';
      QUERY PLAN  
    ---------------------------------------------------------------------------------------------------
    Bitmap Heap Scan on json_daten  (cost=12.00..16.02 rows=1 width=36)
      Recheck Cond: ((data @> '{"farbe": "gelb"}'::jsonb) AND (data @> '{"preis": "25"}'::jsonb))
      ->  Bitmap Index Scan on json_index  (cost=0.00..12.00 rows=1 width=0)
      Index Cond: ((data @> '{"farbe": "gelb"}'::jsonb) AND (data @> '{"preis": "25"}'::jsonb))
    (4 rows)
    
    test=*# select * from json_daten where data @> '{"farbe": "gelb"}' and data @> '{"preis": "25"}';
    artikel |  data  
    ---------+---------------------------------------------------------
      56 | {"datum": "2016-12-01", "farbe": "gelb", "preis": "25"}
    (1 row)
    
    test=*#
    
    (erst das Explain, dann die Abfrage selbst)

    EAV nutzt z.B. Magento, das fragt aber die EAV-Tabellen auch nicht direkt ab, sondern erstellt etwas, was man da 'Flat Table' nennt und was quasi eine aufgedröselte EAV-Tabelle darstellt. Also je Eigenschaft eine Spalte. Das läßt sich einfacher abfragen. Dazu rennt aber alle Nase lang ein Cron, der diese Tabellen erstellt - und sehr viel Last, Locks und Probleme erzeugt. Ich warte auf den Tag, wo die Leute hinter Magento mal zufällig PostgreSQL entdecken ...
     
    Zuletzt bearbeitet: 24 November 2016
    drdimitri gefällt das.
  7. drdimitri

    drdimitri Datenbank-Guru

    Gruselig. Macht das heute wirklich noch jemand?
     
Die Seite wird geladen...
Ähnliche Themen - Abfrageergbnis weiterverarbeiten
  1. ZeroCoolXS
    Antworten:
    1
    Aufrufe:
    2.222

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden