Ben: MYSQL: Join

Hallo zusammen

Ich habe ein Problem mit eine Abfrage und das müsste sich eigentlich mit einem JOIN-Statement lösen lassen. Jedoch bin ich aus der MYSQL-Doku nicht so ganz schlau geworden. Also, ich habe 2 Tables:

Table 1:

id |ca_id
---------------
1 |2
2 |2
3 |2
4 |3

Table 2:

old_id |ca_id
---------------
2 |2
7 |3

Ich möchte nun alle Einträge aus Table 1 haben, welche ca_id=2 haben und nicht in Table2 drin sind. Genauer:

-Aus Table 1 alle Einträge mit ca_id=2
-Aus Table 2 alle Einträge mit ca_id=2
-Diese 2 "Mengen" dann verbinden und am Schluss möchte ich nur noch die Resultate aus 1, welche nicht in 2 enthalten sind wobei table1.id table2.old_id entspricht.

In diesem Falle also die Einträge mit table1.id=1 und table1.id=3

Ich hoffe, ich konnte mich verständlich ausdrücken und jemand kann mir helfen bei dieser Abfrage.

Schonmal danke für eure Hilfe!

Gruss Ben

  1. Hallo Ben,

    für Dein Problem gibt es mindestens zwei Lösungsansätze:

    - mit einem OUTER JOIN (sollte mit jeder MySQL-Version gehen)
      - mit Subselects (erfordert MySQL 4.1.x oder neuer)

    Table 1:

    id |ca_id

    1 |2
    2 |2
    3 |2
    4 |3

    Table 2:

    old_id |ca_id

    2 |2
    7 |3

    Ich möchte nun alle Einträge aus Table 1 haben, welche ca_id=2 haben und nicht in Table2 drin sind. Genauer:
    In diesem Falle also die Einträge mit table1.id=1 und table1.id=3

    Lösung mit OUTER JOIN:

    1. Lass Dir alle Einträge aus Table 1 anzeigen mit der
       Entsprechung in Table 2, auch dann wenn es keine Entsprechung gibt:
       LEFT OUTER JOIN
    2. Schränke die Zielmenge auf die von Dir gewünschten Datensätze ein,
       diese Datensätze haben in table2.ca_id den speziellen Wert NULL, auf
       den Du mit IS NULL prüfen kannst.

    Zwei Lesetipps zu Joins:

    Einführung Joins
    Fortgeschrittene Joins

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz

      Ich möchte es schon gerne mit OUTER JOIN machen. Dann wäre es ungefähr so:

      SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.id=table2.old_id WHERE table2.ca_id IS NULL

      Aber wo definiere ich jetzt, dass ich in beiden tables nur Einträge mit cat_id=2 auslesen möchte?

      Ich weiss, ich weiss, hier werden keine Lösungen präsentiert, sondern nur Lösungsansätze, aber könntest du mir nicht doch ein Statement posten? :-)

      Falls nicht wäre ich froh, wenn du mir die Links nochmals postest, die funktionieren nicht und bei SELFHTML Aktuell finde ich die Artikel nicht.

      Danke und Gruss
      Ben

      1. Hallo Ben,

        Ich möchte es schon gerne mit OUTER JOIN machen. Dann wäre es ungefähr so:

        SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.id=table2.old_id WHERE table2.ca_id IS NULL

        Nach Deiner Darstellung sind die beiden Tabellen in diesem Fall über die Spalte ca_id (beider Tabellen) verknüpft.

        Aber wo definiere ich jetzt, dass ich in beiden tables nur Einträge mit cat_id=2 auslesen möchte?

        Ergänze die WHERE-Klausel durch eine weitere Bedingungen. Beide müssen erfüllt sein, d.h. die logische Verknüpfung ist AND.

        Falls nicht wäre ich froh, wenn du mir die Links nochmals postest, die funktionieren nicht und bei SELFHTML Aktuell finde ich die Artikel nicht.

        Grr, Links sollte man in der Vorschau testen:

        Einführung joins
        Fortgeschrittene joins

        Freundliche Grüße

        Vinzenz

        1. yo,

          SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.id=table2.old_id WHERE table2.ca_id IS NULL

          Nach Deiner Darstellung sind die beiden Tabellen in diesem Fall über die Spalte ca_id (beider Tabellen) verknüpft.

          für mich sieht es eher so aus, dass die beiden tabellen über id und old_id verbunden sind.

          Ilja