if-Bedingung und doppelter Tabellenzugriff

tsunami

Grünschnabel
Hallo,
ich habe eine Tabelle tickets. Die Spalten:
id, beschreibung, nummer, status_id, erstellungsdatum, timestamp, empfaenger,absender.
Die Logik:
Ticket wird erstellt:
Per insert wird die Tabelle gefüllt. Ticket ist erledigt, wird zwecks Historie der nächste Eintrag hinzugefügt, eigendlich nur mit anderem Timestamp, Beschreibung und Status.
Beispiel:
id 1
Beschreibung Kein Licht im Flur 2. OG vor Raum 212
Nummer 201625
status A
Erstellungsdatum 2016-09-30
Timestamp 20160930084512
empfaenger elektro
absender schmidt

Elektro geht hin und repariert die Lampe. Status Update insert
Beschreibung Lampe getauscht
Nummer 201625
status E
Erstellungsdatum 2016-09-30
Timestamp 20160930094512
empfaenger schmidt
absender elektro

Schmidt schaut, ob Licht wieder da ist und quittiert.
Beschreibung Alles Ok
Nummer 201625
status q
Erstellungsdatum 2016-09-30
Timestamp 20160930104512
empfaenger elektro
absender Schmidt

Nun zum Problem:
Ich möchte alle Tickets von Elektro haben, die den Status q haben, aber mit der ursprünglichen Fehlermeldung. Weil sonst habe ich in der Übersicht nur stehen, Alles OK. Licht geht. Danke

Also ticket 20161 Absender Schmidt an Elektro vom 30.09.2016 Kein Licht...
Wenn ich einfach nur nach den Tickets mit max timestamp !=q suche bekomme ich auch tickts zu sehen die uu vechlampt wiurden, nicht erledigt sind usw.
PHP:
SELECT stati.zeichen,t1.id,ticketnummer,beschreibung,status_id,erstellungsdatum,abteilungen.name as melder FROM stati,tickets t1,abteilungen WHERE stati.id=t1.status_id and absender_id=abteilungen.id  and timestamp = (SELECT MAX(t2.timestamp) FROM tickets t2 WHERE t1.ticketnummer = t2.ticketnummer) and status_id!=5 and melder_id!=%s and  empfaenger_id=%s", 
       mysql_real_escape_string($_SESSION['abteilung_id']), 
       mysql_real_escape_string($_SESSION['abteilung_id']),        
       mysql_real_escape_string($_SESSION['abteilung_id']));
zeigt mir schon mal alle Tickets an die zu mir gehen und nicht erledigt sind. Oder muss ich wirklich das Ganze umstukturieren, so dass die ursprüngliche Fehlermeldung mit durchgeschleift wird und nur die Kommis der weiteren Bearbeiter geändert werden.

Eine Idee ist, das Ganze irgend wie mit if(status_=q exists) zu lösen. Oder subselect. Oder tickets in ein array und dann durchlaufen und jedesmal schauen, ob es zu dem ticket einen Status q gibt. Aber dann wirds aufwendig. Es müsste doch per sql Query zu lösen sein...
mfg tsunami
 
Deine Abfrage kannst du mittels eines Joins realisieren.

Desweiteren würde ich dir empfehlen dich mal mit SQL Joins zu beschäftigen.
Deine Abfrage Funktioniert zwar ist aber im Vergleich zu einen Join nicht ganz so performant.

So könnte es z.B. aussehen:
PHP:
$sql = "SELECT s1.zeichen letztes_zeichen,
       t1.id letzte_id,
       t1.ticketnummer,
       t1.beschreibung letzte_beschreibung,
       t1.status_id letzter_status,
       t1.erstellungsdatum letztes_datum,
       t1.abteilungen.name as letzter_melder1,
       s2.zeichen erstes_zeichen,
       t2.id erste_id,
       t2.beschreibung erste_beschreibung,
       t2.status_id erster_status,
       t2.erstellungsdatum erstes_datum,
       t2.abteilungen.name erster_melder
   FROM tickets t1 
          INNER JOIN stati s1 ON s1.id=t1.status_id
          INNER JOIN abteilung a1 on a1.id = t1.absender_id
          INNER JOIN tickets t2 ON t2.nummer = t1.nummer and t2.status = 'A'
          INNER JOIN stati s2 ON s2.id=t2.status_id
          INNER JOIN abteilung a2 on a2.id = t2.absender_id
   WHERE t1.status_id!=5 and
                t1.melder_id!=%s and 
                t1.empfaenger_id=%s;";

Außerdem:
KA ob es dir hier bereits gesagt wurde.
Die mysql_* Funktionen endlich einmotten!!!!!!!
Die sind seit langen deprecated und noch länger nicht mehr gewartet.
Mit PHP 7 auch komplett entfernt.
Wenn du also gerade PHP lernst gewöhne dir garnicht erst diese Funktionen an.
Wenn du es schon kannst gewöhne dir diese schnell ab.

In beiden Fällen bist du mit mysqli oder PDO besser beraten.
Was ich dann auch empfehlen würde beschäftige dich gleich mit prepared Statements!
 
Zurück