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

if-Bedingung und doppelter Tabellenzugriff

Dieses Thema im Forum "PHP" wurde erstellt von tsunami, 30. September 2016.

  1. tsunami

    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.
    Code (PHP):
    1. 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",
    2.       mysql_real_escape_string($_SESSION['abteilung_id']),
    3.       mysql_real_escape_string($_SESSION['abteilung_id']),        
    4.       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
     
  2. merzi86

    merzi86 Erfahrenes Mitglied

    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:
    Code (PHP):
    1. $sql = "SELECT s1.zeichen letztes_zeichen,
    2.       t1.id letzte_id,
    3.       t1.ticketnummer,
    4.       t1.beschreibung letzte_beschreibung,
    5.       t1.status_id letzter_status,
    6.       t1.erstellungsdatum letztes_datum,
    7.       t1.abteilungen.name as letzter_melder1,
    8.       s2.zeichen erstes_zeichen,
    9.       t2.id erste_id,
    10.       t2.beschreibung erste_beschreibung,
    11.       t2.status_id erster_status,
    12.       t2.erstellungsdatum erstes_datum,
    13.       t2.abteilungen.name erster_melder
    14.   FROM tickets t1
    15.          INNER JOIN stati s1 ON s1.id=t1.status_id
    16.          INNER JOIN abteilung a1 on a1.id = t1.absender_id
    17.          INNER JOIN tickets t2 ON t2.nummer = t1.nummer and t2.status = 'A'
    18.          INNER JOIN stati s2 ON s2.id=t2.status_id
    19.          INNER JOIN abteilung a2 on a2.id = t2.absender_id
    20.   WHERE t1.status_id!=5 and
    21.                t1.melder_id!=%s and
    22.                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!
     
Die Seite wird geladen...