Einträge einer Datenbankabfrage mit Join AUSSCHLIESSEN

  • Hallo,

    ich habe eine Tabelle namens "news" und eine Tabelle "news_hidden":

    SELECT s.* FROM `news` AS n JOIN `news_hidden` AS nh ON nh.status_id = n.news_id WHERE nh.user_id <> 2

    Die Tabelle sieht ca so aus:

    NEWS:
    +-----------+
    + news_id +
    +-----------+
    + 1 --------+
    + 2 --------+
    + 3 --------+
    + 4 --------+
    +-----------+

    und in News_hidden steht zB:
    +-----------+----------+
    + news_id + user_id +
    +-----------+----------+
    + 1 --------+ 2 -------+
    + 2 --------+ 2 -------+
    +-----------+----------+

    Ich möchte also erreichen, dass für den Benutzer mit der user_id = 2, die Einträge 1 und 2 nicht aus der Datenbank geholt werden - ich erreiche aber, egal, wie ich es versuche nur das Gegenteil, nämlich, dass genau diese zwei Einträge geholt werden.
    Mir leuchtet auch ein wieso, und warum die obere Abfrage 0 Zeilen ausgibt.

    Aber ich hab keine Ahnung, wie ich das Gegenteil davon erreiche ?

    Hat jemand eine Idee ?
    Lg

  • Bin nun auf folgende Lösung gekommen:

    SELECT s.*, sh.* FROM `status` AS s LEFT JOIN `status_hidden` AS sh ON sh.status_id = s.status_id AND sh.user_id = 1 WHERE sh.user_id IS NULL

    Aber irgendwie gefällt mir das nicht, ich kann mir nicht helfen...

    Jemand, der vllt einen saubereren Lösungsansatz hat?

  • Erstmal: Welchem Zweck dient die Tabelle `news_hidden`? Für mich sieht die ganz stark überflüssig aus, aber erklär doch mal.

    Alternativ schonmal:

    SQL
    SELECT 
      news_id
    FROM
      news
    WHERE
      news_id NOT IN(SELECT news_id FROM news_hidden WHERE user_id=2)

    Deine erste Abfrage sollte aber eigentlich auch hinhauen, mal abgesehen davon, dass du die nicht eins-zu-eins kopiert sondern hier fürs Forum abgeändert hast, was ein absolutes no-go ist, da dadurch nur potentiell weitere Fehler entstehen die das eigentlich Problem verschleiern. -> SELECT s.* -> s ist in deiner Abfrage nicht definiert.

    Ansonsten noch:
    http://www.php-faq.de/q-sql-select.html

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Status ist nicht wirklich selbsterklärend, tatsächlich handelt es sich aber um ein News-Script, und um dies verständlicher rüberzubringen hab ich das in News umbenannt.

  • Ich meinte mit überflüssig, dass ich nicht das Gefühl habe, das die Tabelle eine n:m-Beziehung abbildet, sondern vielmehr nur eine (überflüssige) Erweiterungstabelle darstellt.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook