Twilo: SQL Befehl klappt nur, wenn in allen Tabellen Inhalt ist

Hallo,

ich habe 3 Tabellen, diese Abfrage
in der Tabelle kommentare sind die kommentare für die Tabellen anzeige und ereignis

zur Zeit hat nur die Tabelle ereignis nur Inhalt, die Tabelle anzeige ist noch leer

bei kommentare._art steht deshalb auch überall "ereignis" drin
ich bekomme aber kein Datensatz ausgespuckt :-(
wenn ich jetzt in der Tabelle "anzeige" ein Datensatz anlege (es ist egal, ob der Datensatz als gelöscht oder als nicht freigeschaltet markiert), dann bekomme ich auf einmal 10 Datensätze zurück
warum ist das so?

wie bekomme ich es hin, dass ich auch ein Ergebnis bekomme, wenn die andere Tabelle leer ist?

hier der SQL Befehl
SELECT DISTINCT kommentare._id, kommentare._parent_id, kommentare._art, kommentare._name
FROM kommentare, ereignis, anzeige
WHERE kommentare._freigeschaltet = "1"
AND kommentare._geloescht = "0"
AND
(
  (
    kommentare._art = "ereignis"
    AND ereignis._id = kommentare._parent_id
    AND ereignis._geloescht = "0"
    AND ereignis._freigeschaltet = "1"
  )
  OR
  (
    kommentare._art = "anzeige"
    AND anzeige._id = kommentare._parent_id
    AND anzeige._geloescht = "0"
    AND anzeige._freigeschaltet = "1"
  )
)
ORDER BY kommentare._id DESC
LIMIT 10

_geloescht und _freigeschaltet sind enum Felder enum('0','1')
_geloescht = "0" <--- nicht gelöscht
_freigeschaltet = "1" <--- freigeschaltet

mfg
Twilo

  1. Hi,

    mit LEFT JOIN bekommst du das hin:

    SELECT

    xxx

    FROM

    kommentare k1 LEFT JOIN ereignis e ON k1.parent_id = e._id,

    kommentare k2 LEFT JOIN anzeige a ON k2.parent_id = a._id

    Dabei muss die Tabelle links vom Left Join eine Zeile enthalten, die Rechte Tabelle kann an der Stelle leer sein.
    RIGHT JOIN wäre übrigens die andere Möglichkeit, dann müsste die rechte Tabelle die Zeile enthalten und die der Linken wäre optional.

    1. Hallo,

      mit LEFT JOIN bekommst du das hin:

      aber warum klappt meine Abfrage nur, wenn in beiden Tabellen ein Datensatz vorhanden ist?
      ich tue mir bei Join's imemr schwer *g*
      hab eben bestimmt 10mal das Kapitel Joins in mein Buch und auf MySQL.de durchgelesen, ich werd da nicht ganz schlau draus :-(

      kommentare k1 LEFT JOIN ereignis e ON k1.parent_id = e._id,

      kommentare k2 LEFT JOIN anzeige a ON k2.parent_id = a._id

      ich kann mit dieser Zeile nicht viel Anfangen

      in mein Buch fangen die "Left Joins" immer mit LEFT JOIN an, warum bei dir mit kommentare k1 udn kommentare k2?!

      wie müsste das denn hier aussehen?
      ich blick da nicht ganz durch

      SELECT DISTINCT k._id, k._setcard_id, k._art, k._name
      FROM kommentare AS k, ereignis AS e, anzeige AS a
      WHERE k._freigeschaltet = "1"
      AND k._geloescht = "0"
      AND (
        (
          k._art = "ereignis"
          AND e._id = k._setcard_id
          AND e._geloescht = "0"
          AND e._freigeschaltet = "1"
        )
        OR
        (
          k._art = "anzeige"
          AND a._id = k._setcard_id
          AND a._geloescht = "0"
          AND a._freigeschaltet = "1"
        )
      )
      ORDER BY k._datum DESC
      LIMIT 10

      mfg
      Twilo

      1. Hallo,

        _setcard_id muss natürlich _parent_id lauten
        sorry

        mfg
        Twilo

      2. aber warum klappt meine Abfrage nur, wenn in beiden Tabellen ein Datensatz vorhanden ist?

        kommentare k1 LEFT JOIN ereignis e ON k1.parent_id = e._id,

        kommentare k2 LEFT JOIN anzeige a ON k2.parent_id = a._id

        in mein Buch fangen die "Left Joins" immer mit LEFT JOIN an, warum bei dir mit kommentare k1 udn kommentare k2?!

        ob die Reihenfolge auch anders sein kann, weiß ich nicht...
        jedenfalls sollten das eigentlich keine Kommentare sein, sondern K1 und k2 sind dann die Namen der Tabellen.. so wie kommentar AS k1;
        und du brauchst halt zwei namen, weil du ja einmal auf ereignis und einmal auf anzeige vergeleichen willst

        Ein bisschen was musst du schon selbst ausprobieren, aber so ungefähr:

        SELECT
        k1._id,
        k1._setcard_id
        ...
        k2._id,
        k2._setcard_id
        FROM
        kommentare k1 LEFT JOIN ereignis e ON k1.parent_id = e._id,
        kommentare k2 LEFT JOIN anzeige a ON k2.parent_id = a._id
        WHERE
        k1.freigeschaltet = "1" AND
        k1.geloscht = "0" AND
        k1._art = "ereignis"
        k2.freigeschaltet = "1" AND
        k2.geloscht = "0" AND (
            AND e._geloescht = "0"
            AND e._freigeschaltet = "1"
        )

        OR (
          ...
        )

        Irgendwie so ähnlich...

    2. Hallo,

      hab es jetzt so

      SELECT DISTINCT k._id, k._setcard_id, k._art, k._name
      FROM kommentare AS k
      LEFT JOIN ereignis AS e ON k._setcard_id = e._id
      LEFT JOIN anzeige AS a ON k._setcard_id = a._id
      WHERE k._freigeschaltet = "1"
      AND k._geloescht = "0"
      AND (
      (
      k._art = "ereignis"
      AND e._geloescht = "0"
      AND e._freigeschaltet = "1"
      )
      OR (
      k._art = "gedenkanzeige"
      AND a._geloescht = "0"
      AND a._freigeschaltet = "1"
      )
      )
      ORDER BY k._datum DESC
      LIMIT 10

      das funktioniert auch soweit.
      ist das jetzt so in Ordnung, oder sollte man daran noch etwas ändern?

      mfg
      Twilo