php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 28-04-2009, 17:30
INC.
 Registrierter Benutzer
Links : Onlinestatus : INC. ist offline
Registriert seit: Nov 2005
Beiträge: 106
INC. ist zur Zeit noch ein unbeschriebenes Blatt
Standard Query an einem Stück, möglich?

Hallo ihr,

ich habe folgende Tabelle 'Prozesse':

| id | name | detail1 | detail2 | detail3 |

Man darf sich die Tabelle nicht wie eine Userliste eines Forums vorstellen. Es gibt insgesamt nur 5-6 Prozesse, diese tragen sich jedoch fortlaufend hintereinander immer wieder in die Tabelle ein - eben immer, wenn sie neue Details haben.

Die ID ist autoincrement und hat deswegen nichts mit der Identifikation der Prozesse zu tun.

Beispiel wie das aussehen könnte:

| 1 | Prozess 1 | ..... | ..... | ..... |
| 2 | Prozess 3 | ..... | ..... | ..... |
| 3 | Prozess 1 | ..... | ..... | ..... |
| 4 | Prozess 2 | ..... | ..... | ..... |
| 5 | Prozess 2 | ..... | ..... | ..... |


Ich suche jetzt eine Möglichkeit, wie ich an die Details des jeweils letzten Eintrags eines Prozesses komme.
Hintergrund ist der, das ein Prozess in einem ungünstigen Fall 2 mal hintereinander die gleichen Details besitzt. Kommt das vor, so soll das 2. Mal gar nicht erst in die Tabelle eingetragen werden, da möchte ich schon zuvor in PHP filtern. Dafür brauche ich vermutlich, wie erwähnt, aber die Details des zuletzt eingetragenen, GLEICHNAMIGEN Prozesses, um abzugleichen ob identisch.

Klar, für jeden Prozess ne eigene Tabelle, das wäre einfacher gewesen. Aber es kann sein, dass die Prozessanzahl in Zukunft schwankt (neue kommen hinzu, alte "sterben"), da ist alles in einer Tabelle schöner.

Am liebsten hätte ich das Auslesen der jeweils letzten Details eines Prozesses in einem Query, aber habe nur Workarounds gefunden bis jetzt.

Mit

PHP-Code:
$query "SELECT name, MAX(id) FROM processes GROUP BY name"
kann ich rausfinden, welche ID der jeweils letzte Eintrag eines Prozesses hat. Aber nun muss ich mit dieser ID wieder einen Query starten, um an die Details zu kommen... und in der Zwischenzeit kann sich in der DB schon wieder was getan haben.

Detail1 ist übrigens ein Timestamp, aber leider nur auf eine Minute genau. In einer Minute kann Prozess X aber 10-15 neue Einträge gemacht haben, von dem her wahrscheinlich nutzlos...

Danke und Grüße

Geändert von INC. (28-04-2009 um 17:34 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 28-04-2009, 17:53
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Dass das alles in einem Query möglich ist zweifle ich noch etwas an. Allerdings ein Denkanstoss bzgl. letzter ID http://de.php.net/mysql_insert_id
Mit Zitat antworten
  #3 (permalink)  
Alt 28-04-2009, 17:56
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Klar, für jeden Prozess ne eigene Tabelle, das wäre einfacher gewesen.
Unfug!

Warum speicherst du keinen Timestamp??? Die ID heißt nicht umsonst ID und nicht Timestamp!

Benutz ORDER BY id DESC und nimm den ersten Eintrag. Fertig.

Disclaimer: Die ID sollte generell nicht für die Sortierung verwendet werden.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #4 (permalink)  
Alt 28-04-2009, 17:58
Click
 Member
Links : Onlinestatus : Click ist offline
Registriert seit: Aug 2006
Beiträge: 228
Click ist zur Zeit noch ein unbeschriebenes Blatt
Click eine Nachricht über ICQ schicken
Standard

Schau dir mal Subqueries an.
__________________
Du kannst jeden Tag wie deinen letzten leben, du musst nur jeden Tag das Gleiche tun.

Denk' mal drüber nach!
Mit Zitat antworten
  #5 (permalink)  
Alt 28-04-2009, 18:17
INC.
 Registrierter Benutzer
Links : Onlinestatus : INC. ist offline
Registriert seit: Nov 2005
Beiträge: 106
INC. ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke schonmal.

Zitat:
Original geschrieben von TobiaZ

Warum speicherst du keinen Timestamp??? Die ID heißt nicht umsonst ID und nicht Timestamp!
Wie geschrieben mach ich das doch, Mysql setzt den in Detail1 rein.
Und dann habe ich zu einem Timestamp eventuell 20 Eintragungen, und weiter?

Zitat:
Benutz ORDER BY id DESC und nimm den ersten Eintrag. Fertig.
Dann habe ich den letzten Eintrag von irgend einem Prozess, nicht den letzten Eintrag von jeweils Prozess X, Y und Z, oder nicht?


@Click, danke werd ich machen.
Mit Zitat antworten
  #6 (permalink)  
Alt 28-04-2009, 18:32
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Wie geschrieben mach ich das doch, Mysql setzt den in Detail1 rein. Und dann habe ich zu einem Timestamp eventuell 20 Eintragungen, und weiter?
Also standardmäßig sollten die Timestamps mindestens sekundengenau sein. Zusätzlich könntest du aus der programmlogik heraus einen millisekundengenauen Timestamp erzeugen.

Zitat:
Dann habe ich den letzten Eintrag von irgend einem Prozess, nicht den letzten Eintrag von jeweils Prozess X, Y und Z, oder nicht?
Sorry, ich hatte die Kenntnis des WHERE-Arguments als Grundlage vorausgesetzt. Ich kau nicht gerne den kompletten Code vor, ein bisschen mitdenken muss drin sein.

Zusätzliche Queries auch in form von Subqueries sind also vollkommen überflüssig, wenn man vernünftig vorgeht.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #7 (permalink)  
Alt 28-04-2009, 23:43
INC.
 Registrierter Benutzer
Links : Onlinestatus : INC. ist offline
Registriert seit: Nov 2005
Beiträge: 106
INC. ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TobiaZ
[B]Also standardmäßig sollten die Timestamps mindestens sekundengenau sein.
Ist wohl besser, ja. Füge jetzt vorerst UNIX_TIMESTAMP() über das Statement in der Programmlogik ein, zuvor ließ ich das MySQL automatisch mittels der Option Standard: CURRENT_TIMESTAMP machen, welche man in phpmyadmin auswählen kann. Leider gibts dort nichts zum auswählen, was nach unix timestamp aussieht, oder kann man das manuell nachtragen? Wäre schon praktischer, wenn man das aus der Programmlogik draussen hat.

Zitat:
Sorry, ich hatte die Kenntnis des WHERE-Arguments als Grundlage vorausgesetzt. Ich kau nicht gerne den kompletten Code vor, ein bisschen mitdenken muss drin sein.
Tut mir leid, habe das wohl missverstanden. Ja, die Lösung ist in der Tat eine Option, danke.

Wollte jetzt aber noch wissen, warum du dich eigentlich gegen diese Lösung sträubst. Die ID ist doch ein eindeutiges Merkmal, während ich bei der Zeit auf Millisekunden runtermuss, wie du schon erwähntest (+ Erzeugung in der Programmlogik).
Mit Zitat antworten
  #8 (permalink)  
Alt 29-04-2009, 07:36
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zwischen den Zeilen ist zu lesen, dass die Prozesse sehr viel in diese Tabelle schreiben, die Abstände zwischen den Writes daher sehr kurz sein werden. Bei zuviel Concurrency blockieren sich die Prozesse. Hast du daran gedacht? Läuft das DB-Logging asynchron (INSERT DELAYED)? Hat die DB irgendwann die Chance, die aufgestauten Writes abzuarbeiten? Ansonsten ist DB-Logging vielleicht der falsche Ansatz.

Wenn du das alles berücksichtigst, brauchst du gar nicht per Select abfragen, ob der selbe Eintrag schon vorhanden ist. Denn die aufgestauten Writes siehst du nicht und damit wäre das Select nicht korrekt.

Mach es mit REPLACE DELAYED und überlasse so der DB das Auffinden von Duplikaten.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script ansehen ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script

Mit unserer Lösungen können Sie nahezu jeden B2B / B2C Marktplatz betreiben den Sie sich vorstellen können. Ganz egal ob Sie einen Automarktplatz, Immobilenportal oder einfach einen Anzeigenmarkt betreiben möchten. Mit ebiz-trader können Sie Ihre Anforder

11.10.2018 Berni | Kategorie: PHP/ Anzeigenmarkt
PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:52 Uhr.