MySQL-Abfrage mit INNER- und LEFT JOIN

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • MySQL-Abfrage mit INNER- und LEFT JOIN

    Auf meiner Webseite können User ihre eigenen "Lesezeichen" zu Elementen der Webseite anlegen. Diese sind in Kategorien und diese Kategorien können jedoch unter Umständen nur für User mit bestimmten Rechten sein. Die Rechte sind eine Art Level von 1-10.

    Quellcode

    1. SELECT COUNT(l.id) AS anzahl
    2. FROM lesezeichen AS l
    3. INNER JOIN elemente AS e ON e.id = l.element_id
    4. LEFT JOIN kategorien AS k ON k.id = e.kategorie_id
    5. WHERE l.nutzer_id = '123' && (k.level <= '5' || ISNULL(k.id))

    Diese Abfrage funktioniert leider nicht. Das ganze ist so gedacht: Es werden alle Elemente gezählt, die entweder von den Rechten her passen oder die unkategoriesiert sind und daher keine Rechteinformationen haben. Die Einschränkung ist, dass nur die Lesezeichne gezählt werden sollen von Nutzer 123.

    Auf einem anderen Teil der Webseite kann man die neuen Elemente einsehen, da funktioniert bspw. folgende Abfrage mit dem LEFT JOIN einwandfrei und es werden entweder kategoriesierte Elemente angezeigt, wenn die Rechte passen, oder die, die unkategoriesiert sind.

    Quellcode

    1. SELECT e.title
    2. FROM elemente AS e
    3. LEFT JOIN kategorien AS k ON k.id = e.kategorie_id
    4. WHERE (k.level <= '5' || ISNULL(k.id))
    5. ORDER BY e.datum DESC LIMIT 5

    Deswegen vermute ich, dass es an den kombinierten JOINs liegt, wäre super wenn mir jemand von euch helfen könnte! :)
  • Also ohne mir über die Logik Gedanken zu machen, kannst du basierend auf dem zweiten Query einfach das erste wie folgt konstruieren:

    Quellcode

    1. SELECT COUNT(x.id)
    2. FROM (
    3. SELECT e.id
    4. FROM elemente AS e
    5. LEFT JOIN kategorien AS k ON k.id = e.kategorie_id
    6. WHERE (k.level <= '5' || ISNULL(k.id))
    7. ) x
    8. INNER JOIN lesezeichen AS l ON e.id = l.element_id;