Dani: SQL-Befehl

Hallo,

ich brauche Hilfe bei einem SQL-Befehl.Ausschnitt aus Tabelle:

subNummer   Nummer
S1 ________ 1000
S2 ________ 1000
S2 ________ 1001
S2 ________ 1002
S3 ________ 1002
S4 ________ 1001

SELECT subNummer FROM tabelle where nummer in (1000,1001,1002)

Liefert ALLE subNummern (S1 bis S4) die entweder 1000, 1001 oder 1002 in der Spalte nummer enthalten haben. Ich brauche aber nur die subNummern die 1000 und 1001 und 1002 enthalten haben (im Beispiel S2). Ich bekomms einfach nicht hin, würde mich um Hilfe freuen!

  1. Hi,
    ich weiß gerade nicht, ob's da noch was kürzeres gibt, aber das hier sollte klappen. Die Frage ist nur, kannst du deiner Abfrage im Voraus mitgeben wie viele Einträge diese IN-Liste enthält? Wenn ja:
    SELECT subNummer
    FROM tabelle
    WHERE nummer IN (1000,1001,1002)
    GROUP BY subNummer
    HAVING COUNT(*) = 3

    -> Sucht Datensätze die den Kriterien entsprechen, fasst sie nach gleicher subNummer zusammen und zählt dabei, wie viele zusammengefasst wurden. Du musst allerdings dazu wissen, nach wievielen Zusammenfassungen du suchst.

    MfG
    Rouven

    --
    -------------------
    ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
    1. Hi !

      SELECT subNummer
      FROM tabelle
      WHERE nummer IN (1000,1001,1002)
      GROUP BY subNummer
      HAVING COUNT(*) = 3

      bei

      S1--------1000
      S1--------1000
      S1--------1000
      S2--------1000
      S2--------1001
      S2--------1002

      bekommt man aber S1 und S2 als Antwort. Gesucht war aber, daß nur S2 als Antwort kommt, weil S2 die einzige ist, die 1000, 1001 und 1002 hat.

      Gruß

      Hans

      1. Hi,

        komm, lass uns streiten, dafür ist deine Lösung untauglich oder zumindest extrem aufwändig für variierende Anzahlen.

        Deine Kritik ist sicherlich berechtigt, da kann ich dann nur mit schlechtem Design kontern, da die Einträge in der unmittelbaren Form dann keinen Sinn machen.

        MfG
        Rouven

        --
        -------------------
        ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
        1. Okay danke es funktioniert. Eine Frage hätt ich noch, wie kann ich einen select Count(*) auf diese Abfrage noch absetzen, für den Fall dass die Abfrage keine Ergebnisse zurückliefert?

          1. Hi !

            Jetzt weiß ich nicht, ob Deine MySQL-Version subselects unterstützt. Falls ja:

            select count(1) into i from dual where exists (select irgendwas from tabelle);

            i=0 -> kein Ergebnis
            i=1 -> Mindest. 1 Ergebnis

            Gruß

            Hans

            1. Hi !

              Jetzt weiß ich nicht, ob Deine MySQL-Version subselects unterstützt. Falls ja:

              select count(1) into i from dual where exists (select irgendwas from tabelle);

              i=0 -> kein Ergebnis
              i=1 -> Mindest. 1 Ergebnis

              Gruß

              Hans

              Nein, leider funktioniert das nicht. Hättest du  mir noch eine Idee? Komme leider im Moment kaum weiter.

              1. Hi !

                Jetzt weiß ich nicht, ob Deine MySQL-Version subselects unterstützt. Falls ja:

                select count(1) into i from dual where exists (select irgendwas from tabelle);

                i=0 -> kein Ergebnis
                i=1 -> Mindest. 1 Ergebnis

                Gruß

                Hans

                Nein, leider funktioniert das nicht. Hättest du  mir noch eine Idee? Komme leider im Moment kaum weiter.

                Kann mir denn keiner helfen?

                Ist echt nicht so praktisch dass die aktuellen Themen nicht oben stehen.

                1. Hi !

                  Kann mir denn keiner helfen?

                  Ist echt nicht so praktisch dass die aktuellen Themen nicht oben stehen.

                  Also, Du machst folgendes:

                  select count(spalte) into i from tabelle where irgend_eine_bedingung;

                  Dann müsstest Du in i einen Wert haben, der Dir die Anzahl der gefundenen Ergebnisse gibt.

                  Gruß

                  Hans

                2. Hallo.

                  Ist echt nicht so praktisch dass die aktuellen Themen nicht oben stehen.

                  So wie es ist, ist es praktisch.
                  MfG, at

          2. Hi,

            Okay danke es funktioniert. Eine Frage hätt ich noch, wie kann ich einen select Count(*) auf diese Abfrage noch absetzen, für den Fall dass die Abfrage keine Ergebnisse zurückliefert?

            In dem Fall, daß die Abfrage keine Ergebnisse liefert, ist der count(*) für diese Abfrage immer 0 - also gibt es keinen Grund, extra noch eine Abfrage für diese 0 an die Datenbank zu schicken.

            Wieviele Datensätze die eigentliche Abfrage liefert, läßt sich üblicherweise auch ohne zusätzliche Abfrage rausfinden (in php für mysql mit  mysql_num_rows, in anderen Sprachen und bei anderen DB-Systemen wird es ähnliche Konstrukte geben ...)

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        2. Hi,

          komm, lass uns streiten, dafür ist deine Lösung untauglich oder zumindest extrem aufwändig für variierende Anzahlen.

          Mal davon abgesehen, daß meine Lösung richtig ist: Natürlich ist sie für den Fall, daß man 1000 - 1010 braucht, entsprechend zu adaptieren, aber man kann nicht sagen, daß eine Lösung für beliebig komplizierte Sachverhalte immer trivial und jederzeit mit minimalem Aufwand erweiterbar sein muß.

          Deine Kritik ist sicherlich berechtigt, da kann ich dann nur mit schlechtem Design kontern, da die Einträge in der unmittelbaren Form dann keinen Sinn machen.

          Nun, je nachdem, wie die "Hauptaufgabe" der Applikation aussieht. Wenn das Design am Anfang darauf abgezielt hat, einfach nur Zahlen zu erfassen und am Ende des Monats herauszufinden, wie oft "1000" vorkommt, mag das Design richtig sein. Sollte allerdings die Hauptaufgabe jene von Dani zu Anfang beschriebene sein, dann muß man an dem Design in der Tat gehörig etwas machen.

          Gruß

          Hans

    2. yo,

      man muss deine query nur leicht abändern, und dann löst es das problem, dass hans angesprochen hat.

      SELECT subNummer
      FROM tabelle
      WHERE nummer IN (1000,1001,1002)
      GROUP BY subNummer
      HAVING COUNT(DISTINCT nummer) = 3

      Ilja

      1. Hi Ilja,

        gut zu Wissen, Distinct innerhalb von Count hatte ich bisher noch nicht gesehen...

        MfG
        Rouven

        --
        -------------------
        ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
      2. Hi !

        SELECT subNummer
        FROM tabelle
        WHERE nummer IN (1000,1001,1002)
        GROUP BY subNummer
        HAVING COUNT(DISTINCT nummer) = 3

        hätte ich nicht gedacht, daß "HAVING" auch auf Spalten funktioniert, die zwar in der Tabelle, aber nicht in der "GROUP BY"-Anweisung vorkommen.

        Wieder was gelernt :-)

        Gruß

        Hans

  2. Hi !

    subNummer   Nummer
    S1 ________ 1000
    S2 ________ 1000
    S2 ________ 1001
    S2 ________ 1002
    S3 ________ 1002
    S4 ________ 1001

    SELECT subNummer FROM tabelle where nummer in (1000,1001,1002)

    Liefert ALLE subNummern (S1 bis S4) die entweder 1000, 1001 oder 1002 in der Spalte nummer enthalten haben. Ich brauche aber nur die subNummern die 1000 und 1001 und 1002 enthalten haben (im Beispiel S2). Ich bekomms einfach nicht hin, würde mich um Hilfe freuen!

    select a.subnummer from tabelle a, tabelle b, tabelle c where a.nummer=1000 and a.subnummer=b.subnummer and b.nummer=1001 and a.subnummer=c.subnummer and c.nummer=1002;

    Gruß

    Hans

    1. yo,

      select a.subnummer from tabelle a, tabelle b, tabelle c where a.nummer=1000 and a.subnummer=b.subnummer and b.nummer=1001 and a.subnummer=c.subnummer and c.nummer=1002;

      auch bei dieser lösung fehlt das DISTINCT.

      Ilja