Sätze finden, die in Verknüpfung etwas NICHT haben

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

  • Sätze finden, die in Verknüpfung etwas NICHT haben

    Guten Tag

    Ich hab ein Durcheinander in meinem Kopf und finde einfach nicht heraus, wie ich folgende Aufgabe mit einer einzigen SELECT Abfrage lösen könnte:

    (Beispiel)

    Tabelle_1 hat Feld "id"
    Tabelle_2 hat Felder "t1_id" (Verweis zur id von Tabelle_1) und "antwort" (mit enum Wert "ja" oder "nein")

    Zu jedem Record in Tabelle_1 kann es in Tabelle_2 keinen, einen oder mehrere Records haben.

    Nun möchte ich alle Datensätze von Tabelle_1 finden, zu denen es in Tabelle_2 KEINEN Satz mit "nein" gibt.

    (Natürlich kann ich die ganze Tabelle_1 durchlesen und in einer Subroutine für jeden einzelnen Record jeweils suchen, ob in Tabelle_2 dazu kein Datensatz mit "nein" vorhanden ist. Aber das scheint mir nicht gerade elegant.)

    Es gibt doch sicher eine schlauere Lösung, oder?

  • #2
    Stichwort : Join

    Schau bei www.mysql.de in der Dokumentation.


    An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

    Kommentar


    • #3
      Hm, irgendwie versteh ich net ganz wozu das ganze

      Benutze auch Group by auf id in Tabelle 1
      Zuletzt geändert von MaxP0W3R; 27.04.2004, 10:27.


      An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

      Kommentar


      • #4
        http://php-resource.de/forum/showthr...threadid=28292

        hth
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          Hm, danke für die blitzschnellen Anworten. Nur werde ich daraus nicht schlau. leider auch nicht aus dem Link und der Erklärung bei mySql selber...

          Meine Beispieltabellen:
          Code:
          CREATE TABLE `tab1` (
            `id` int(11) NOT NULL auto_increment,
            PRIMARY KEY  (`id`)
          ) TYPE=MyISAM AUTO_INCREMENT=5 ;
          
          INSERT INTO `tab1`VALUES
          (1),
          (2),
          (3),
          (4);
          
          CREATE TABLE `tab2` (
            `id` int(11) NOT NULL auto_increment,
            `tab1_id` int(11) NOT NULL default '0',
            `jn` enum('j','n') default NULL,
            PRIMARY KEY  (`id`)
          ) TYPE=MyISAM;
          
          INSERT INTO `tab2` VALUES
          (1, 1, 'j'),
          (2, 1, 'n'),
          (3, 2, 'n'),
          (4, 3, 'j'),
          (5, 3, 'j'),
          (6, 4, 'n'),
          (7, 4, 'j');
          Ich suche also nach dem tab1.id, für den es in tab2.jn nirgends einen Wert "n" hat. Darauf trifft hier nur tab1.id "3" zu.

          Was ich bis jetzt mit JOINS gebastelt habe, sieht z.B. so aus:

          Code:
          SELECT tab1.id, tab2.id, tab2.jn
          FROM tab1
          LEFT  JOIN tab2 ON tab1.id = tab2.tab1_id 
          WHERE tab2.jn != "n" 
          GROUP BY tab1.id
          Da bekomm ich als Resultat aber natürlich die tab1.id's 1, 3 und 4, weil's für die ja alle einen tab2.record gibt, der einen Nicht-N Wert hat. Effektiv möchte ich aber nur tab1.id 3 erhalten, denn nur für den gibt es KEIN "n".

          Darf ich auf eine Hilfe hoffen, die ich auch als nur wenig erfahrener Nicht-Fachmann verstehe?

          Kommentar


          • #6
            group by is dafür nicht gedacht

            les meinen link nochmal, da steht was von datensätzen, die keine entsprechung in einer zweiten tabelle haben (tipp: da steht NULL dabei)

            du musst den ON-teil so erweitern, dass er nur die datensätze findet, deren ids übereinstimmen und die ein 'n' haben

            davon nimmst du nur die WHERE keine entsprechung gefunden wurde
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              mal ne frage .... wieso hat tab1 nur eine spalte?
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                Abraxax: ... Weil das ja nur ein Beispiel ist und es hier nur auf die id ankommt. Dort, wo ich es wirklich brauche, hats viele, viele Spalen - aber mit denen komm ich jetzt hier nicht auch noch

                mrhappiness: das muss ich erst mal auf mich wirken lassen... Ich probier heut abend mal rum... danke vorerst.

                Kommentar


                • #9
                  Original geschrieben von hilfhoff
                  Abraxax: ... Weil das ja nur ein Beispiel ist und es hier nur auf die id ankommt.
                  stand nur nirgenswo ...

                  und bei den fragen hier im forum hätte es mich ehrlich gesagt auch nicht mehr gewundert... was jetzt nicht gegen dich gerichtet ist.
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    Also, vielen Dank für die Hilfe mrhappiness!

                    Falls (falls!) ich das richtig verstanden habe, wäre also folgende Abfrage die Richtige:
                    Code:
                    SELECT tab1.id, tab2.id, tab2.jn
                    FROM tab1
                    LEFT JOIN tab2 ON tab1.id = tab2.tab1_id AND tab2.jn = "n"
                    WHERE tab2.id IS NULL;
                    Im Versuch mit den Beispieltabellen hats jedenfalls geklappt. Ehrlich, auf sowas wär ich allein nie gekommen. Thanks!

                    Kommentar


                    • #11
                      sieht gut aus, aber tab2.id und tab2.jn musst du dir ja nicht zurückliefern lassen, da du deren wert ja schon kennst
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        Danke, klar. Die Felder hab ich nur für den Test, damit ich die Resultate besser verstehen konnte....

                        Kommentar

                        Lädt...
                        X