[MySQL 4.0] Abfrage nach Datensätzen die nicht vorhanden sind

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

  • [MySQL 4.0] Abfrage nach Datensätzen die nicht vorhanden sind

    Folgendes Problem stellt sich mir gerade:
    In meine Datenbank werden Ausfallzeiten von Servern gespeichert. Sagen wir mal es gibt 5 versch. Server. Wenn nun wenn in einer best. Zeitspanne kein Eintrag zu 2 Servern da ist, aber zu den andern 3? Ich gege eine Tabellenreihe in einer while-Schleife aus, in dem logischerweise dann nur die 3 Server stehen. Wie gebe ich jetzt automatisch für die 2 anderen Server andere Daten aus??
    Hat da jemand eine Idee?

  • #2
    mir ist nicht ganz klar, was du willst.

    wie soll denn deine Ausgabe aussehen?

    Kommentar


    • #3
      Also die Ausgabe sieht momentan so aus, das die Ausfallzeiten von den Servern angezeigt werden, z.B. der letzten 24 Stunden.
      Z.B. Server 1, Server 3, und Server 1 zu einer anderen Zeit.
      Jetzt soll automatisch für die anderen Server auf der Webseite angezeigt werden, das eben bei diesen kein Ausfall da war in den letzten 24 Stunden. Wie das aussieht ist eigentlich egal, wichtig ist nur, wie man die Abfrage daraufhin erstellt, das er immer von den Servern die nicht in der Datenbank als Ausfall stehen, eine andere Anzeige auf der Webseite erstellt.

      Ich weiß das ist schwierig zu erklären, aber ich hoffe jetzt wurde es deutlicher. Problematisch ist halt, das z.B. am nächsten Tag ja wiederrum andere Server ausfallen können und demnach andere Server keinen Ausfall hatten. Diese müssen dann wieder wie oben beschrieben eine andere Ausgabe auf der Webseite bekommen.

      Kommentar


      • #4
        Ich weiss halt net wie deine Tabellen aussehen, aber vielleicht hilft dir das weiter. Also nehmen wir an du hast deine Server in einer Tabelle geplegt. In einer Tabelle hast du dann die Ausfallzeiten geplegt. Über eine Server ID werden die Ausfallzeiten dann dem Server zugewiesen. So stelle ich mir jetzt eine einfache Tabellenstruktur vor.

        Code:
        SELECT S.* FROM SERVER S
        LEFT JOIN AUSFALLZEITEN AZ ON (AF.SERVER_ID = S.SERVER_ID)
        WHERE AZ.SERVER_ID IS NULL and AZ.AUSFALLZEIT >= CURRENT_DATE
        Versuch es mal damit. Ansonsten konnte dir die Funktion EXISTS von mysql vielleicht noch weiterhelfen.
        Ans Ziel kommt nur der, der auch eins hat. www.e-cross.info

        Kommentar


        • #5
          wenn ich es jetzt richtig verstanden habe, kann in der Tabelle 3x Server1, 1 x Server4 für die 24 Stunden drinstehen und du willst eine Tabelle, in der eben 3x Server1 und jeweils 1x Server2-4 aufgelistet steht, wobei bei Server4 wieder eine Ausfallzeit aufgeführt ist.

          Entweder du machst den Select schon so, dass du die gewünschten Zeilen erhälst (dafür brauchst du eine Tabelle, in der alle Server vermerkt sind) oder du liest den Resultset komplett in ein Array aus und bei der Ausgabe prüfst du, ob ein ServerX einen Eintrag hat oder nicht. Aber die DB-Lösung nach Pascal finde ich auf jeden Fall die sinnvollere.

          Kommentar


          • #6
            Original geschrieben von BrainBug
            wenn ich es jetzt richtig verstanden habe, kann in der Tabelle 3x Server1, 1 x Server4 für die 24 Stunden drinstehen und du willst eine Tabelle, in der eben 3x Server1 und jeweils 1x Server2-4 aufgelistet steht, wobei bei Server4 wieder eine Ausfallzeit aufgeführt ist.
            Nicht ganz, in der Tabelle für die Ausfallzeiten stehen NUR Ausfallzeiten. Wenn ein Server keinen hatte, steht dort kein Datensatz. Aber ich habe wie ihr richtig bemerkt habt eine extra Tabelle mit den Servern, in der Datensatztabelle mit den Ausfallzeiten wird jeweils nur die ID des jeweiligen Servers abgespeichert.

            Original geschrieben von BrainBug
            Entweder du machst den Select schon so, dass du die gewünschten Zeilen erhälst (dafür brauchst du eine Tabelle, in der alle Server vermerkt sind) oder du liest den Resultset komplett in ein Array aus und bei der Ausgabe prüfst du, ob ein ServerX einen Eintrag hat oder nicht. Aber die DB-Lösung nach Pascal finde ich auf jeden Fall die sinnvollere.
            Ich werde beides mal versuchen, mal sehen wie ich klar komme. Bisher schonmal Danke!

            Kommentar


            • #7
              Original geschrieben von Pascal P.
              Ich weiss halt net wie deine Tabellen aussehen, aber vielleicht hilft dir das weiter. Also nehmen wir an du hast deine Server in einer Tabelle geplegt. In einer Tabelle hast du dann die Ausfallzeiten geplegt. Über eine Server ID werden die Ausfallzeiten dann dem Server zugewiesen. So stelle ich mir jetzt eine einfache Tabellenstruktur vor.

              Code:
              SELECT S.* FROM SERVER S
              LEFT JOIN AUSFALLZEITEN AZ ON (AF.SERVER_ID = S.SERVER_ID)
              WHERE AZ.SERVER_ID IS NULL and AZ.AUSFALLZEIT >= CURRENT_DATE
              Versuch es mal damit. Ansonsten konnte dir die Funktion EXISTS von mysql vielleicht noch weiterhelfen.
              Könnte mir jemand mal die Funktion von pascal erklären:
              Meine Tabelle für die Ausfallzeit heißt "tagesstatus", dort gibt es als Fremdschlüssel die "server_id". Diese wiederrum gibt es als Primärschlüssel in der Tabelle "server". Wo muss ich in der obigen syntax jetzt was einsetzen??

              Kommentar


              • #8
                du ersetzt AUSFALLZEITEN durch tagesstatus

                Pascals SELECT macht folgendes: Die beiden Tabellen werden anhand der server_id verknüpft, daach wird so gefiltert, dass nur server_ids drinstehen, die nicht in der tabelle tagesstatus drinstehen
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Original geschrieben von mrhappiness
                  du ersetzt AUSFALLZEITEN durch tagesstatus

                  Pascals SELECT macht folgendes: Die beiden Tabellen werden anhand der server_id verknüpft, daach wird so gefiltert, dass nur server_ids drinstehen, die nicht in der tabelle tagesstatus drinstehen
                  OK, jetzt wird das ganze klarer!
                  Aber wofür stehen denn "S.*" und "AF" ???

                  Kommentar


                  • #10
                    FROM SERVER S => die spalten der tabelle kannst du jetzt mit S.<spaltenname> ansprechen

                    für AF gilt genau das selbe
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      Ich hab das jetzt mal so gemacht:

                      PHP-Code:
                      SELECT S.* FROM server S
                      LEFT JOIN tagesstatus AZ ON 
                      (AZ.server_id S.server_id)
                      WHERE AZ.server_id IS NULL and AZ.tag_stoerstart_datum >= CURRENT_DATE
                      So bekomme ich eine leere Ausgabe. Wenn ich das "AZ.server_id" in "AF.server_id" abändere bekomme ich eine Fehlemeldung:
                      Unknown table 'AF' in on clause

                      Irgendwas stimmt da noch nicht....

                      Kommentar


                      • #12
                        AF kann ja nich gehen, weil es keine tabelle gibt die so heißt

                        mach aus dem AND mal ein OR

                        du suchst ja die server, die nicht in tagesstatus drinstehen ODER deren störung vor weniger als 1 tag behoben wurde

                        Code:
                        az.server_id IS NULL OR az.tag_stoerstart_datum >=NOW() - INTERVAL 1 DAY
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          "tag_stoerstart_datum" ist das Datum, an dem der Server ausgefallen ist. Momentan bekomme ich zwar eine Ausgabe, aber die entspricht nicht dem was eigentlich sein sollte.
                          Es wird unter anderem auch ein Sever ausgegeben, der als Eintrag in "tagesstatus" mit einer Störung drinsteht....

                          Kommentar


                          • #14
                            Code:
                            SELECT 
                              S.*, IF(ISNULL(AZ.tag_stoerstart_datum),'nicht ausgefallen', AZ.tag_stoerstart_datum)
                            FROM
                              server s
                              LEFT JOIN tagesstatus az USING (server_id)
                            WHERE
                              az.server_id IS NULL
                              OR
                              az.tag_stoerstart_datum>=NOW() - INTERVAL 1 DAY
                            sollte dir alle server liefern und entweder ein 'nicht ausgefallen' oder das datum des störungsauftritts, wenn die störung innerhalb der letzten 24 stunden auftrat

                            probier das mal in phpmyadmin aus und poste was rauskommt


                            wenn's nich das is, was rauskommen soll, poste auch noch was du haben willst
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              Das sieht schon mal super aus, Ausgabe:


                              server_id............ser_name...............IF(ISNull az.tag_stoerst.......
                              ......2....................server2.................nicht ausgefallen
                              ......3....................server3.................nicht ausgefallen
                              ......4....................server4.................2003-08-19
                              ......6....................server5.................nicht ausgefallen


                              Die Ausgabe stimmt soweit mit den Datensätzen der Ausfälle überein.
                              Aber er gibt den 1. und den 5. Server nicht aus, die normalerweise auch keinen Eintrag hatten. Woran könnte denn das liegen ?

                              Kommentar

                              Lädt...
                              X