Denkanstoß bei der Formulierung einer Abfrage mittels Join

  • Hallo zusammen,


    ich brauche mal einen gedanklichen Anstoß bei einer Abfrage, weil mir falsche Daten gefiltert werden. Mir ist auch klar, warum ich falsche Ergebnisse bekomme. Ich überlege aber die ganze Zeit krampfhaft, wie ich filtern muss, um das richtige Ergebnis zu bekommen.


    Zunächst die Tabellen und ein paar wenige Inhalte (Nur relevante), um die es geht:


    Tabelle 1:

    Relevante Spalten = name (varchar 255), userid(INT)


    Tabelle 2:

    Relevante Spalten = bewerter_ID(INT, ag_id(INT)


    In dieser Tabelle 2 gibt es bereits folgende Einträge:


    bewerter_ID | ag_ID

    460 | 477

    460 | 471

    460 | 476

    462 | 476


    Was will ich erreichen?


    Es sollen alle Namen uns Tabelle 1 augegeben werden, außer die Namen, die bereits vom eingeloggten Benutzer mittels bewerter_id gemäß Tabelle 2 bewertet wurden.


    Das ist also das Ziel, was am Ende rauskommen soll.


    Mein Ansatz sieht zunächst so aus:


    PHP
    <?php
    $abfrage = "SELECT tabelle1.name, tabelle2.bewerter_id FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.userid = tabelle2.ag_id ORDER BY tabelle1.name ASC";
    ?>


    Damit werden mit alle Namen angezeigt. Ich hatte dann versucht, mit einer WHERE Anweisung zu arbeiten: -> WHERE bewerter_id != $userid ($userid enthält die ID des eingeloggten Benutzers).


    Nun wird mir zwar Eintrag 4 (462 | 476) nicht mehr angezeigt. Das ist auch richtig. Aber dafür wird logischerweise 460 | 476 angezeigt, denn hier ist bewerter_id ja != $userid. Dieser Eintrag darf aber auch nicht angezeigt werden, da bewerter_ID 462 ja ag_id 476 bereits bewertet hat.


    Nun überlege ich bereits seit 2 Tagen, wie ich die Abfrage bestimmen muss. Wahrscheinlich ist es gar nicht so schwer, aber ich komme einfach nicht drauf und muss mit der Nase mal reingedrückt werden.

  • Falls ich das Problem richtig verstehe würde ich ganz primitiv zwei selects machen.


    Mit der ersten alle id's ermitteln, die schon in tabelle 2 sind, mit der zweiten dieseids bei der ermittlung der namen ausschließen.

    Ungefähr so:


    (array) $exclude = select distinct bewerter_id from tabelle2


    $names = select id, name from tabelle1 where user_id not in implode (', ', $exclude)