coolblue: mal wieder join ;-(

Beitrag lesen

Kommentare
+-----------------+-----------------+-----------------+-----
| _id             | _setcard_id     | _art            | ...
+-----------------+-----------------+-----------------+-----
| 1               | 1               | ereignis        | ...
+-----------------+-----------------+-----------------+-----
| 2               | 2               | ereignis        | ...
+-----------------+-----------------+-----------------+-----
| 3               | 1               | anzeige         | ...
+-----------------+-----------------+-----------------+-----
| 4               | 3               | ereignis        | ...
+-----------------+-----------------+-----------------+-----
| 5               | 2               | anzeige         | ...
+-----------------+-----------------+-----------------+-----

ok let's go

Bedingung
ein Kommentar soll nur ausgegeben werden, wenn das Ereignis/Anzeige Freigeschaltet und nicht gelöscht ist

Freigeschaltet = 1
nicht gelöscht = 0

und kommentare._id=1

zuerst habe ich mir gedacht, warum ein kommentar anzeigen, wenn es in einer der beiden tabellen (tabelle1 oder tabelle2) als nicht freigeschaltet oder gelöscht makiert ist, ausgeben lassen... eigentlich müssten beide bedingungen immer zutreffen:

select   a.id
         ,a.setcard_id
         ,a.ereignis
from     kommentare a
         ,tabelle1 b
         ,tabelle2 c
where    a.id=b.id
and      a.id=c.id
and      a.id=1
and      b.geloescht=0
and      b.freigeschaltet=1
and      c.geloescht=0
and      c.freigeschaltet=1
;

aber da du der master of destaster bist und über dein projekt den besseren überblick hast, geht es auch mit "oder":

select   distinct a.id
         ,a.setcard_id
         ,a.ereignis
from     kommentare a
         ,tabelle1 b
         ,tabelle2 c
where    a.id=b.id
and      a.id=c.id
and      a.id=1
and      (
         b.geloescht=0
and      b.freigeschaltet=1
or       (
         c.geloescht=0
and      c.freigeschaltet=1
         )
         )
;

der grund, weshalb da ein distinct drin ist, ist recht einfach. dadurch, dass freigeschaltet und nicht gelöscht entweder in tabelle1 oder tabelle2 true zurückgeben kann, kann das kommentar auch für jeden true rückgabewert ausgegeben werden, das heißt einmal für tabelle1 und tabelle2. distinct reduziert doppelte ausgaben auf 1.

das nächste select statement scheint auf den ersten anhieb ebenfalls korrekt, aber bei genauer betrachtung der where klausel erkennt man schnell, dass durch die or bedingung die bedingung a.id=1 aufgehoben wird, sobald die or bedingung den wert true zurück gibt.

select   distinct a.id
         ,a.setcard_id
         ,a.ereignis
from     kommentare a
         ,tabelle1 b
         ,tabelle2 c
where    a.id=b.id
and      a.id=c.id
and      a.id=1
and      (
         b.geloescht=0
and      b.freigeschaltet=1
         )
or       (
         c.geloescht=0
and      c.freigeschaltet=1
         )
;

also wäre das falsch.

ich habe mir auf die schnelle die drei tabellen gebastlet (oracle 9.2.0.5) und die select statements getestet, deshalb fehlen auch die führenden unterstriche (_id)... alle statements sind zwar syntaktisch richtig, allerdings ist für dich - wenn ich dich richtig verstanden habe - nur das 2. resultat von belangen!

wenn ja, halte ich davon relativ wenig... es geht nichts über Freehand-SQL !

ich finde, dass man das aber besser lesen kann,a sl wenn ich da ne ellenlange SQL-Anweisung sehe :)

es gibt menschen, die leben in der windows regedit oder können megabytes hexdumps lesen... alles eine sache der übung :-)
zu denen gehöre ich allerdings nicht, aber ein paar hundert zeilen code wären kein problem!

schon mal danke für deien Mühe

no problem, hab ja sonst nix zu tun :-)

falls es trotzdem noch nicht funzt, dann scheinst du wohl ein anderes problem zu haben.
sollte das 2. statement noch immer nichts ausgeben, dann kann es auch einfach daran liegen, dass es keine kommentare gibt, die freigeschaltet=1 und gelöscht=0 sind.

Viele Grüße,
coolblue

--

never say oops after you submitted a job :-)
_der_Ton_macht_die_Musik_!!!_