Hilfe für mysql qry

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hilfe für mysql qry

    Hallo,

    Ich bräuchte Hilfe bei einem/mehreren SQL Query's.

    Zuersteinmal der Hintergrund:
    Es handelt sich um ein Alarmanlagen Monitoring, dass ich im Rahmen meiner Ausbildung zum Fachinformatiker basteln soll.
    Letztendlich soll überprüft werden ob ein Bereich über nacht Scharfgestellt war oder nicht:

    Gesucht werden in der Datenbank (siehe unten) alle vorkommen bei denen die "Action"="ENTSCHAERFT" ist, nachdem der Bereich schon "Action"="GESCHAERFT"wurde (abhänig von einer Uhrzeit also bis 1 Uhr zum beispiel)


    Die Datenbank sieht so aus:
    Code:
    ISEId     Counter     Date            PersID    Action         Linie    Keyx                 Dummy
    xxx     37831         2007-05-03 16:45:33     ns     ENTSCHAERFT     1     161254165057001000000000     0
    xxx     41631         2007-06-18 17:05:21     jk     ZUTRITT     3     161219207205003000000000     0
    xxx     43116         2007-07-04 18:08:26     mba     ---         1     161009111149004000000000     1
    xxx     43122         2007-07-05 00:10:31     GSA     ---         2     161028075152004000000000     1

    Hier ein beispiel wie sich die bereiche zusammensetzen
    Code:
    +-----------------+-------+
    | ISEId      | Linie |
    +-----------------+-------+
    | xxx001    |     0 | Eingang
    | xxx002    |     1 | Keller1
    | xxx003    |     2 | Erdgeschoss1
    | xxx004    |     3 | Erdgeschoss Einlieger
    | xxx005    |     0 | Blah
    | xxx006    |     1 | Blah2
    | xxx007    |     2 | Bah3

    Über hilfe und anregungen würde ich mich freuen.

    Paul

  • #2
    Hallo,

    dein Anliegen ist so nicht nachvollziehbar. Dort steht nirgends "GESCHAERFT", dafür aber "---".

    Dann sieht es so aus, als bildeten ISEId und Linie einen Mehrfeldprimärschlüssel. Muss das sein? Wenn ja, warum? Sind in der ersten Tabelle dann beide Spalten ein Mehrfeldfremdschlüssel?

    Formulier bitte dein Problem in Form von Pseudocode oder ausführlichem Text, z. B. "Liefere alle Datensätze aus Tabelle XY, für die es ... gibt, wenn ... kleiner als ... aus der Tabelle YZ ist, wobei ..."

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Zitat von AmicaNoctis Beitrag anzeigen
      Dann sieht es so aus, als bildeten ISEId und Linie einen Mehrfeldprimärschlüssel. Muss das sein? Wenn ja, warum? Sind in der ersten Tabelle dann beide Spalten ein Mehrfeldfremdschlüssel?
      Ja das muss leider so sein, da unsere Alarmanlage das so vorgibt (RDFI Chip System das von einer Externen Firma so eingerichtet wurde und ich nichts

      Zitat von AmicaNoctis Beitrag anzeigen
      Formulier bitte dein Problem in Form von Pseudocode oder ausführlichem Text, z. B. "Liefere alle Datensätze aus Tabelle XY, für die es ... gibt, wenn ... kleiner als ... aus der Tabelle YZ ist, wobei ..."
      Vielleicht hätte ich noch erwähnen sollen das das ganze in PHP umgesetzt werden soll.

      Kleine Erklärung: Das Script wird jeden Tag automatisiert ausgeführt und soll nur für den letzten Tag ausgeben ob Abends der jeweilige Bereich scharf gestellt wurde.

      Dann versuch ich das mal:
      Code:
      // < im bezug auf Datumsangaben bedeutet jünger 11.11.2010 < 10.11.2010
      for "alle Bereiche" 
      
      array1 =
      {SELECT * FROM `tblprotokoll` 
      WHERE Action=GESCHAERFT & Date <= {Aktuelle Zeit-1 Tag}
      }
      array2 =
      {SELECT * FROM `tblprotokoll` 
      WHERE Action=ENTSCHAERFT & (Date <= {Aktuelle Zeit- 1 Tag}
      }
      //-- Unter der Voraussetzung, dass  in den Array's nur das letzte vorkommen (Zeitmäßig)
      for i = 1 to array1.last i=i+1
           for j=1 to array2.last j=j+1
                if array1(i.Date) < array2(j.Date) then
                    Bereich ist unscharf
                else
                    Bereich ist scharf
                end if
           do
      do

      Kommentar


      • #4
        Code:
        SELECT ... 
        FROM ... 
        WHERE `Action` = 'GESCHAERFT' 
        AND YEAR(`Date`) = $year 
        AND MONTH(`Date`) = $month 
        AND DAY(`Date`) = $day 
        AND HOUR(`Date`) BETWEEN $eveningStart AND $eveningEnd
        liefert die Einträge eines Tages. Da das Script jeden Tag läuft, ist das völlig ausreichend.
        Du musst lediglich die $-Variablen so belegen, dass es passt.
        Zuletzt geändert von onemorenerd; 24.11.2010, 13:59.

        Kommentar


        • #5
          Ich versuch's mal, sag einfach ob so es richtig ist, also ob du es so meintest:

          Liefere alle Bereiche, die a) nach 18:00 nicht scharf gestellt wurden oder b) bereits vor 6:00 wieder entschärft worden sind.

          Kommt das hin? Wenn Bereich A abends nicht scharf gestellt wurde, greift Teilbedingung a. Wenn Bereich B zwar abends scharf gestellt wurde, aber später (z. B. 20:00 und damit vor 6:00) wieder entschärft wurde, greift Teilbedingung b. Letztere würde aber auch greifen, wenn jemand um 0:00 kommt, entschärft, 1 Stunde bleibt und um 1:00 beim Gehen wieder scharf stellt. Hier musst du entscheiden, ob du das willst.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Zitat von AmicaNoctis Beitrag anzeigen
            Ich versuch's mal, sag einfach ob so es richtig ist, also ob du es so meintest:

            Liefere alle Bereiche, die a) nach 18:00 nicht scharf gestellt wurden oder b) bereits vor 6:00 wieder entschärft worden sind.

            Kommt das hin? Wenn Bereich A abends nicht scharf gestellt wurde, greift Teilbedingung a. Wenn Bereich B zwar abends scharf gestellt wurde, aber später (z. B. 20:00 und damit vor 6:00) wieder entschärft wurde, greift Teilbedingung b. Letztere würde aber auch greifen, wenn jemand um 0:00 kommt, entschärft, 1 Stunde bleibt und um 1:00 beim Gehen wieder scharf stellt. Hier musst du entscheiden, ob du das willst.
            Leider geht das so nicht, da wir Bereiche bei uns im Bürokomplex haben, die bis spät in die Nacht (oder auch mal Morgenstunden) begangen werden.


            Ich Versuche es mal aus zu Formulieren:

            Wenn Bereich A abends scharf gestellt wurde und danach bis 6 Uhr niemand mehr entschärft: Alles okay.

            Wenn Bereich B abends scharf gestellt wurde, aber Nachts entschärft wurde und dann wieder scharf gestellt wurde, ist alles okay.

            Wenn Bereich C abends nicht scharf gestellt wurde und dieser Zustand bis 6.00 Uhr anhält, muss dies Ausgegeben werden.

            Wenn Bereich D abends scharf gestellt wurde, aber Nachts entschärft wurdeund dieser Zustand bis 6.00 Uhr anhält, muss dies Ausgegeben werden.

            Gruß
            Paul

            Kommentar


            • #7
              Zitat von PaulK Beitrag anzeigen
              Leider geht das so nicht, da wir Bereiche bei uns im Bürokomplex haben, die bis spät in die Nacht (oder auch mal Morgenstunden) begangen werden
              Okay, das versteh ich, aber dann musst du in deinen Beispielen das Wort "abends" definieren.

              Ich würde in diesem Falle das was du suchst so formulieren: Alle Bereiche, die um 05:59:59 Uhr nicht scharf waren, bevor um 06:00:00 alles wieder entschärft wurde. Passt das besser?
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #8
                Ja das trifft es.

                Ob abends nun 18.00 Uhr ist oder schon um 14.00 Uhr anfängt hat ja eigentlich nur Auswirkung auf die Laufzeit des Scriptes da, mehr Datensätze durchsucht werden müssen.

                Gibt es in PHP eine Möglichkeit ein SQL QRY in ein Mehrdimisionales Aray zu schreiben, bzw hat jemand eine funktion für mich parat mit der ich Arbeiten kann?
                Zuletzt geändert von PaulK; 24.11.2010, 15:58.

                Kommentar


                • #9
                  Na dann ist es ganz einfach:

                  1. Du holst dir das letzte Scharfstellen und das letzte Entschärfen
                  Code:
                  select ...
                  from ...
                  where `Action` = 'GESCHAERFT'
                      and `Date` < $time
                  order by `Date` desc
                  limit 1
                  und
                  Code:
                  select ...
                  from ...
                  where `Action` = 'ENTSCHAERFT'
                      and `Date` < $time
                  order by `Date` desc
                  limit 1
                  wobei $time die Uhrzeit des Entschärfens am darauffolgenden Morgen ist, z. B. 06:00:00

                  2. Du vergleichst du die beiden Datensätze hinsichtlich der Zeit und erkennst daraus den letzten aktiven Zustand vor $time.

                  Das ganze kann man natürlich auch in einer einzigen Abfrage machen, indem man Self Joins benutzt.
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10


                    Habe meinen brain lag überwunden und seit ich deine Antwort habe gut 3/4 des Scripts fertig geschrieben.

                    Kommentar

                    Lädt...
                    X