php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Thema geschlossen
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.11.2011, 17:14  
Igotcha
Gast
 
Beiträge: n/a
Standard [SQL] Hilfe bei Abfrage mit Historie

Hallo zusammen,

ich habe hier ein kleines Problem mit einer MySQL-Abfrage und komme nicht weiter.

Tabelle 1: orders
orderid
weitere Felder

Tabell 2: status_history
status_history_id
orderid
order_status_id
date_added

In der Tabelle 2 werden Order / Bezahlstati zu einer Order, je nach anfallendem Zeitpunkt geschrieben. Eine Order hat also mehrere Stati in der Historie (offen, bezahlt, versendet, wartend, etc.), die durch die order_status_id repräsentiert werden.

Bei elektronischer Bezahlung kann dies z.B. sein "PayPal offen", "PayPal bezahlt", "PayPal wartend".

Ich möchte mir nun alle Orders ausgeben lassen, die den letztgültigen Status mit der order_status_id = 5 haben.

Danke und Grüße
Igotcha
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.11.2011, 17:24  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

http://dev.mysql.com/doc/refman/5.0/...group-row.html
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline  
Alt 09.11.2011, 19:03  
Igotcha
Gast
 
Beiträge: n/a
Standard

So ähnlich is mein aktueller Versuchsstand, aber das ist nicht das, was ich brauche.

So sieht z.B. eine "normale" Order aus. 5=bezahlt, 8=versendet. Diese möchte ich mit der Abfrage nicht haben.

Code:
ID    ORD STAT  UPDATETIME
877   227  1   2011-11-06 14:02:59 	
878   227  6   2011-11-06 14:03:04 	
879   227  5   2011-11-06 14:03:08
880   227  8   2011-11-06 14:03:24
Jetzt gibt es aber auch so etwas:

Code:
ID    ORD STAT  UPDATETIME
877   227  1   2011-11-06 14:02:59 	
878   227  6   2011-11-06 14:03:04 	
879   227  5   2011-11-06 14:03:08
880   227  4   2011-11-06 14:03:10
881   227  5   2011-11-06 14:03:24
Nehme ich jetzt die Abfrage aus Deinem Link (Tabellen mal geändert)

Code:
SELECT article, dealer, price
FROM   order s1
WHERE  ???=(SELECT MAX(s2.update_time)
              FROM orders_status_history
              WHERE s1.id = s2.orders_id);
dann muss ich ja per MAX über das Datum gehen (es soll ja der letztgültige Status geprüft werden), aber was ist in diesem Fall dann ???

Die einzige Relation zwischen den beiden Tabellen ist ja die id von Tabelle1.

Hintergrund der Aktion: Das Script läuft alle 5 Minuten, soll schauen, ob eine neue und bezahlte Order da ist und in diesem Fall dann eine andere Aktion anstossen.

Geändert von Igotcha (09.11.2011 um 19:07 Uhr).
 
Alt 09.11.2011, 19:12  
Erfahrener Benutzer
 
Registriert seit: 01.06.2011
Beiträge: 389
PHP-Kenntnisse:
Anfänger
achtelpetit befindet sich auf einem aufstrebenden Ast
Standard

Wenn ich Dich richtig verstehe, suchst Du alle DS, bei denen das Maximum von "Status" = 5 ist?
achtelpetit ist offline  
Alt 09.11.2011, 19:16  
Igotcha
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von achtelpetit Beitrag anzeigen
Wenn ich Dich richtig verstehe, suchst Du alle DS, bei denen das Maximum von "Status" = 5 ist?
Eben nicht das "Maximum", sondern den letzten Statuswert, in diesem Fall möchte ich alle Orders mit letztem Status = 5 haben (es gibt z.B. Status = 8, das ist versendet und davor wurde natürlich irgendwann bezahlt, Status = 5). Und der letzte Wert ist der, der den letzten Timestamp zu einer Order (orderid) hat (es muss also der letzte Timestamp zu einer Order geprüft werden nicht der letzte Timestamp überhaupt).

Sagen wir, in den letzten 5 Minuten sind 4 Orders eingegangen und diese haben in der Status_History als letzten Wert:

order1 status = 5 (bezahlt)
order2 status = 0 (offen)
order3 status = 6 (PayPal wartend)
order4 status = 5 (bezahlt)

Ich möchte jetzt nur die Orders 1 und 4 als Ergebnis haben.

Die Stati sind leider nicht dem Bestellablauf logisch aufteigend vergeben, weshalb ich über den Timestamp den letzten suchen muss.

EDIT: Mir wäre auch geholfen, wenn ich diese Abfrage nur auf die Tabelle orders_status_history hinbekommen würde. Dann könnte ich die eigentlichen Orders mit einer zweiten Abfrage innerhalb einer Schleife holen.

Also aus der Tabelle:

Code:
ID    ORD STAT  UPDATETIME
877   227  1   2011-11-06 14:02:59 	
878   227  4   2011-11-06 14:03:04 	
879   227  5   2011-11-06 14:03:08
880   228  1   2011-11-06 14:03:10
881   228  0   2011-11-06 14:03:24
882   229  1   2011-11-06 14:04:10
883   229  5   2011-11-06 14:04:24
884   229  8   2011-11-06 14:04:34
885   230  1   2011-11-06 14:05:24
886   230  5   2011-11-06 14:05:34
die Order-IDs 227 und 230.

Geändert von Igotcha (09.11.2011 um 19:37 Uhr).
 
Alt 09.11.2011, 21:10  
Erfahrener Benutzer
 
Registriert seit: 01.06.2011
Beiträge: 389
PHP-Kenntnisse:
Anfänger
achtelpetit befindet sich auf einem aufstrebenden Ast
Standard

Code:
ID    ORD STAT  UPDATETIME
877   227  1   2011-11-06 14:02:59 	
878   227  4   2011-11-06 14:03:04 	
879   227  5   2011-11-06 14:03:08
880   228  1   2011-11-06 14:03:10
881   228  0   2011-11-06 14:03:24
882   229  1   2011-11-06 14:04:10
883   229  5   2011-11-06 14:04:24
884   229  8   2011-11-06 14:04:34
885   230  1   2011-11-06 14:05:24
886   230  5   2011-11-06 14:05:34
Zitat:
die Order-IDs 227 und 230.
Bei 227 ist das Max = 5
Bei 228 ist das Max = 1
Bei 229 ist das Max = 8
Bei 230 ist das Max = 5

Habe ich Dich falsch verstanden? Suchst Du nicht alle, bei denen das Maximum = 5 ist?
achtelpetit ist offline  
Alt 09.11.2011, 21:46  
Igotcha
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von achtelpetit Beitrag anzeigen
Habe ich Dich falsch verstanden? Suchst Du nicht alle, bei denen das Maximum = 5 ist?
Ja falsch verstanden Ich suche NICHT das "Max".

Ich möchte die Orders haben, wo der letzte Status, also der Status mit dem höchsten Timestamp einer Order = 5 ist:

ID ORD STAT UPDATETIME
877 227 1 2011-11-06 14:02:59
878 227 4 2011-11-06 14:03:04
879 227 5 2011-11-06 14:03:08
880 228 1 2011-11-06 14:03:10
881 228 0 2011-11-06 14:03:24
882 229 1 2011-11-06 14:04:10
883 229 6 2011-11-06 14:04:18
884 229 5 2011-11-06 14:04:24
885 229 8 2011-11-06 14:04:34
886 230 1 2011-11-06 14:05:24
886 230 5 2011-11-06 14:05:34

Das ist nur bei der Order 227 und 230 der Fall.

Order 228 hat gar keinen Eintrag mit Status = 5 und der letzte Status bei Order 229 ist 8. Der MAX status wäre auch 8 und nicht 5, weshalb ich MAX nicht verwenden kann.

Ich formulieren die Abfrage mal pseudo:

"Suche mir die Order-IDs raus, bei denen der letzte Eintrag (=höchster Timestamp) einer Order(-ID) einen Wert "status = 5" hat."

Geändert von Igotcha (09.11.2011 um 22:18 Uhr).
 
Alt 09.11.2011, 22:21  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Igotcha
Ich formulieren die Abfrage mal pseudo:

"Suche mir die Order-IDs raus, bei denen der letzte Eintrag (=höchster Timestamp) einer Order(-ID) einen Wert "status = 5" hat."
Nimm die JOIN-Variante auf der Seite, die ich dir nicht ohne Grund genannt habe … und ergänze die Bedingung, dass status = 5 sein soll.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline  
Alt 09.11.2011, 23:01  
Igotcha
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von ChrisB Beitrag anzeigen
Nimm die JOIN-Variante auf der Seite, die ich dir nicht ohne Grund genannt habe … und ergänze die Bedingung, dass status = 5 sein soll.
Ich habe das jetzt mal so umformuliert:

Code:
SELECT s1.orders_id
FROM orders_status_history s1
JOIN (
  SELECT orders_id, orders_status_id, MAX(date_added) AS lastadd
  FROM orders_status_history
  GROUP BY orders_id) AS s2
  ON s1.orders_id= s2.orders_id AND s1.orders_status_id = s2.orders_status_id
WHERE s1.orders_status_id=5

Ergebnis: 1 Treffer für eine alte Bestellung mit folgenden Daten (das Ergebnis wäre in diesem Fall "falsch"):

orders_status_history_id orders_id orders_status_id date_added
738 193 5 2011-10-08 17:56:30
736 193 1 2011-10-08 17:56:13
737 193 6 2011-10-08 17:56:17
739 193 8 2011-10-08 17:58:10

Das wäre dann aber eine Order, die ich nicht haben möchte, da diese abgeschlossen ist Letzter Status ist 8 und nicht 5.

Und warum schmeisst er mir diese eine raus? Alle komplettierten Orders (mit letztem Status = 8 ) haben den selben Aufbau.

Und setze ich die WHERE Klausel testweise auf 8 (=abgeschlossen) kommen 8 Treffer... eigentlich müssten dann ja ALLE abgeschlossenen Bestellungen angezeigt werden (auch dieses Ergebnis wäre "falsch").

8
10
8
63
160
186
192

Zudem kommt die Bestellung 8 doppelt vor.

Ich habe mal einen csv-Auszug der Tabelle drangehängt. Hier sind aber aktuell alle Bestellungen abgeschlossen (letzter Status = 8 ). Einfach bei einigen Bestellungen die Zeile mit dem Status = 8 entfernen.
Angehängte Dateien
Dateityp: txt orders_status_history.txt (16,0 KB, 12x aufgerufen)

Geändert von Igotcha (09.11.2011 um 23:23 Uhr).
 
Alt 10.11.2011, 10:54  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Ich meinte die zweite JOIN-Variante, die dort aufgeführt ist …
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline  
Thema geschlossen


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Abfrage von einer Abfrage Datenbanken 5 27.01.2011 23:31
False Abfrage und SQL hängt sich auf marc77 Datenbanken 4 22.11.2010 14:57
[Erledigt] Abfrage aus mehreren Tabellen HiddenX Datenbanken 6 24.08.2010 14:45
[Erledigt] Brauche Hilfe bei einer If Abfrage TrueEdge PHP Tipps 2010 7 22.04.2010 15:50
Sache der Abfrage? Bitte um Hilfe ! idontknow Datenbanken 4 20.04.2010 15:35
[Erledigt] hilfe bei db Abfrage mit Kathegorien hups Datenbanken 4 09.12.2009 22:45
MySQL - Fehler in einfacher Abfrage oden Datenbanken 11 03.01.2009 20:03
Hilfe bei SQL Abfrage Cyberbob_at_tot Datenbanken 1 29.11.2005 18:56
[Erledigt] mysql abfrage - Hilfe Datenbanken 2 25.10.2005 20:44
Abfrage von mehreren Werten mit Hilfe von LIKE? PHP Tipps 2005-2 4 12.09.2005 19:19
[Erledigt] mysql abfrage über 4 Tabelle - bis 3 geht, bei der 4. habert Datenbanken 2 08.09.2005 11:59
hilfe bei abfrage PHP Tipps 2005-2 15 15.08.2005 20:47
brauche hilfe beim DB abfrage Cyrus PHP Tipps 2005-2 5 14.08.2005 20:07
Hilfe bzgl. Datenbank abfrage PHP Tipps 2004 5 24.06.2004 18:21


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:24 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum