Cruz: brauche krasses Statement

Hallo Leute,

ich komme nicht drauf. Ich habe 2 Tabellen, eine mit Applikationen, eine mit Bugs. Die Bugs sind per Bug.Application_id den Applikationen zugeordnet. Ich brauche alle Applikationen, die NICHT den Bug Nr. 1 haben. Das sind natürlich auch alle Applikationen, die gar keinen Bug haben. Meine Annäherung soweit:

SELECT Application.*
FROM Application LEFT JOIN Bug ON Application.id = Bug.Application_id
WHERE (Bug.id IS NULL OR Bug.id <> 1)

Das Problem ist, wenn eine Application sowohl Bug 1 als auch Bug 2 hat, dann steht er trotzdem noch in der Liste. Wie komme ich weiter?

Danke,
Cruz

  1. Ach so..subqueries sind nicht erlaubt...sonst wäre es ja einfach. :)

    1. N'Abend,

      ich hätte da nur einen verrückten Versuch, obs gut ist oder überhaupt klappt weiß ich nicht:
      SELECT Application.id, MIN(Bug.id) AS bugs
      FROM Application LEFT JOIN Bug ON Application.id = Bug.Application_id
      GROUP BY application.id
      HAVING bugs = NULL OR bugs > 1

      Klappt aber nur für die 1, ansonsten wirds böse.

      MfG
      Rouven

      --
      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
      1. Das mit der 1 war nur beispielsweise gemeint. Ich möchte schon eine beliebige Bugnummer angeben können. Aber trotzdem danke!

        1. *Grübel*
          also wenn es hier nur um die Subquery-unfähige MySQL-Datenbank geht, dann könntest du deren GROUP-BY-Toleranz ausnutzen: In MySQL darfst du auch nicht aggregierte Werte nach einem group-by abfragen, d.h. du könntest mal probieren was
          SELECT Application.id, Bug.id
          FROM Application LEFT JOIN Bug ON Application.id = Bug.Application_id
          GROUP BY application.id
          HAVING Bug.id <> 1
          rausbringt.

          MfG
          Rouven

          --
          -------------------
          ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
          1. Hallo

            also wenn es hier nur um die Subquery-unfähige MySQL-Datenbank geht, dann könntest du deren GROUP-BY-Toleranz ausnutzen: In MySQL darfst du auch nicht aggregierte Werte nach einem group-by abfragen, d.h. du könntest mal probieren was

            und unvorhersehbare Resultate bekommen, wie die MySQL-Doku besagt, siehe auch mein Posting in einem anderen Thread :-)

            Na, wenn das nicht zu Bugs passt. *bg*

            Ist kein Upgrade von MySQL möglich? Neuere Versionen haben doch einiges an Funktionalität hinzugewonnen.

            Freundliche Grüße

            Vinzenz

            1. Ist kein Upgrade von MySQL möglich? Neuere Versionen haben doch einiges an Funktionalität hinzugewonnen.

              Leider ist das nicht drin. Z.z. habe ich das mit 2 Queries und einer scriptseitigen Logik gelöst. Irgendjemand meinte mal, dass man jede Subquery mit JOINs umschreiben kann, aber dieses Beispiel scheint es tatsächlich zu wiederlegen. Ich kann mir nicht vorstellen, wie diese Aufgabe einfach durch Auswahl aus einem kartesischem Produkt zu realisieren ist.

  2. Ich nochmal,

    hab doch noch was gegrübelt:
    SELECT Application.id
    FROM Application INNER JOIN Bug ON Application.id = Bug.Application_id AND Bug.id = 1
    Das hier liefert ja alle diejenigen App-IDs, die einen Bug 1 haben. Na ja, gut, joinen wir halt mit denen jetzt erneut in die App-Tabelle und fordern kein Ergebnis:

    SELECT app_ziel.*, app_filter.id AS testid
    FROM
       Application app_filter
       INNER JOIN Bug ON app_filter.id = Bug.Application_id AND Bug.id = 1

    LEFT JOIN Application app_ziel
       ON app_filter.id = app_ziel.id
    WHERE testid IS NULL

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Hi!

      klappt leider so nicht, es gibt nur einen empty set. Aber ist ein guter Ansatz, ich brüte gerade dran.

      Gruß,
      Cruz

      SELECT app_ziel.*, app_filter.id AS testid
      FROM
         Application app_filter
         INNER JOIN Bug ON app_filter.id = Bug.Application_id AND Bug.id = 1

      LEFT JOIN Application app_ziel
         ON app_filter.id = app_ziel.id
      WHERE testid IS NULL

  3. Boa eh krass eh..

  4. Hi Crass, äh, Cruz

    select application.name from application where application.application_id not in (select bug.application_id from bug where bug.bug_nr=1);

    Gruß

    Hans

    1. Hi,

      ich glaube das fällt unter die Kategorie "benutzt Subselect" und war nicht gewünscht.

      MfG
      Rouven

      --
      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  5. yo,

    SELECT Application.*, MIN(IF(bug.id = 1, 0, 1)) AS Check
    FROM Application
    LEFT JOIN Bug
    ON Application.id = Bug.Application_id
    GROUP BY Application.*
    HAVING MIN(CHECK) = 1

    Ilja