SQL Befehl klappt nur, wenn in allen Tabellen Inhalt ist
Twilo
- datenbank
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
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.
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
Hallo,
_setcard_id muss natürlich _parent_id lauten
sorry
mfg
Twilo
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...
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