Abfrageergbnis weiterverarbeiten

Tja_was

Neuer Benutzer
Beiträge
4
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
 
Werbung:
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.
 
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?
 
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..
 
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:
Werbung:
Zurück
Oben