Twilo: mal wieder join ;-(

Hallo,

ich komme hier nicht weiter *grml*

ich habe 3 Tabellen

+-----------------+-----------------+-------------+
| Tabelle1        | Tabelle2        | Kommentare  |
+-----------------+-----------------+-------------+
| _id             | _id             | _id         |
+-----------------+-----------------+-------------+
| _geloescht      | _geloescht      | _setcard_id |
+-----------------+-----------------+-------------+
| _freigeschaltet | _freigeschaltet | _art        |
+-----------------+-----------------+-------------+
| ...             | ...             | ...         |
+-----------------+-----------------+-------------+

_setcard_id hat entweder die ID von Tabelle1 oder Tabelle2

ich möchte 10 Datensätze aus Kommentare abrufen
Bedingung
die _setcard_id dard nicht gesperrt sein
der Kommentar muss freigeschaltet sein

ich probiere hier bestimmt schon einige Stunden, komme aber zu keinen Erfolg

hier mein letzter Ansatz

SELECT kommentare._setcard_id, kommentare._art, kommentare._name
FROM kommentare, tabelle1, tabelle2
WHERE (
  tabelle1._id = kommentare._setcard_id
  OR tabelle2._id = kommentare._setcard_id
)
AND kommentare._freigeschaltet = "1"
AND kommentare._geloescht = "0"
AND (
  tabelle1._geloescht = "0"
  OR tabelle2._geloescht = "0"
)
ORDER BY kommentare._id DESC
LIMIT 0 , 10

ich danke schon mal für eure Hilfe

mfg
Twilo

  1. Hallo Twilo,

    select a._setcard_id
           ,a._art
           ,a._name
    from   kommentare a
           ,tabelle1 b
           ,tabelle2 c
    where  a._setcard_id=b._id
    and    a._setcard_id=c._id
    and    a._freigeschaltet=1
    and    a._geloescht=0
    and    (
           b._geloescht=0
    or     c._geloescht=0
           )
    order by a._id
    ;

    ich danke schon mal für eure Hilfe

    warten wir's ab :-)

    Viele Grüße,
    coolblue

    --

    never say oops after you submitted a job :-)
    _der_Ton_macht_die_Musik_!!!_
    1. Hallo,

      select a._setcard_id
             ,a._art
             ,a._name
      from   kommentare a
             ,tabelle1 b
             ,tabelle2 c
      where  a._setcard_id=b._id
      and    a._setcard_id=c._id
      and    a._freigeschaltet=1
      and    a._geloescht=0
      and    (
             b._geloescht=0
      or     c._geloescht=0
             )
      order by a._id
      LIMIT 0,10 ;

      ich hab das jetzt so eingegeben,
      aber ich bekomme kein Ergebnis :-(

      where  a._setcard_id=b._id
      and    a._setcard_id=c._id

      das kann glaube ich auch nicht ganz stimmen
      da a._setcard_id entweder zu b._id oder zu c._id gehören kann

      ich hatte da schon mal ein OR gesetzt, aber dann hatte ich sowas rausbekommen

      +-------------+----------+-----------+
      | _setcard_id | _art     | _name     |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+
      | 1           | ereignis | Klaus bla |
      +-------------+----------+-----------+

      mfg
      Twilo

      1. Hallo,

        where  a._setcard_id=b._id
        and    a._setcard_id=c._id

        welche Software nutzt du? MySQL?

        Ich wollte mit diesen Bedingungen zunächst einmal die Tabellen verknüpfen und das hat zunächst nichts mit den Werten zu tun, die du am Ende herausbekommen möchtest.

        Aus deiner ersten Nachricht konnte ich nicht herausfiltern, nach welchen Bedingungen nun etwas selectieren wolltest.

        Bitte versuche es nochmal zu schildern.

        Grundlegendes:

        Tabelle1
        -------------------------------------------------
        | Tab1-Spalte1  | Tab1-Spalte2  | Tab1-Spalte3  |
        -------------------------------------------------
        | Wert1-Spalte1 | Wert1-Spalte2 | Wert1-Spalte3 |
        -------------------------------------------------
        | Wert2-Spalte1 | Wert2-Spalte2 | Wert2-Spalte3 |
        -------------------------------------------------

        Tabelle2
        -------------------------------------------------
        | Tab2-Spalte1  | Tab2-Spalte2  | Tab2-Spalte3  |
        -------------------------------------------------
        | Wert1-Spalte1 | Wert1-Spalte2 | Wert1-Spalte3 |
        -------------------------------------------------
        | Wert2-Spalte1 | Wert2-Spalte2 | Wert2-Spalte3 |
        -------------------------------------------------

        Kommentare
        -------------------------------------------------
        | Komm-Spalte1  | Komm-Spalte2  | Komm-Spalte3  |
        -------------------------------------------------
        | Wert1-Spalte1 | Wert1-Spalte2 | Wert1-Spalte3 |
        -------------------------------------------------
        | Wert2-Spalte1 | Wert2-Spalte2 | Wert2-Spalte3 |
        -------------------------------------------------

        Verknüpfung der Tabellen über eine Spalte, hier Spalte1 jeder
        Tabelle. Deine primäre Tabelle soll Kommentare sein.

        where komm.spalte1=tab1.spalte1
        and   komm.spalte1=tab2.spalte1

        Jetzt willst du nur bestimmte Werte haben, und zwar (Beispiel!!!) alle Werte, die aus Tabelle1-Spalte2 auf 0 stehen und in Tabelle2-Spalte3 auf 1.

        and   tab1.spalte2=0
        and   tab2.spalte3=1

        Wenn mich nicht alles täuscht, dann müsste die Bedingung

        and   (
              tab1.spalte2=0
        or    tab2.spalte3=1
              )

        genau das gleiche ausgeben, habe es aber nicht getestet und kann es somit nicht mit Sicherheit behaupten!

        Viele Grüße,
        coolblue

        --

        never say oops after you submitted a job :-)
        _der_Ton_macht_die_Musik_!!!_
        1. Hallo,

          also

          +-----------------+-----------------+-------------+
          | Tabelle1        | Tabelle2        | Kommentare  |
          +-----------------+-----------------+-------------+
          | _id             | _id             | _id         |
          +-----------------+-----------------+-------------+
          | _geloescht      | _geloescht      | _setcard_id |
          +-----------------+-----------------+-------------+
          | _freigeschaltet | _freigeschaltet | _art        |
          +-----------------+-----------------+-------------+
          | ...             | ...             | ...         |
          +-----------------+-----------------+-------------+

          Tabelle1 (ereignis)
          +-----------------+-----------------+-----------------+-----
          | _id             | _geloescht      | _freigeschaltet | ...
          +-----------------+-----------------+-----------------+-----
          | 1               | 0               | 1               | ...
          +-----------------+-----------------+-----------------+-----
          | 2               | 1               | 1               | ...
          +-----------------+-----------------+-----------------+-----
          | 3               | 0               | 0               | ...
          +-----------------+-----------------+-----------------+-----

          Tabelle2 (anzeige)
          +-----------------+-----------------+-----------------+-----
          | _id             | _geloescht      | _freigeschaltet | ...
          +-----------------+-----------------+-----------------+-----
          | 1               | 1               | 1               | ...
          +-----------------+-----------------+-----------------+-----
          | 2               | 1               | 1               | ...
          +-----------------+-----------------+-----------------+-----
          | 3               | 0               | 0               | ...
          +-----------------+-----------------+-----------------+-----

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

          jetzt sollte nur Kommentar 1 ausgegeben werden

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

          ps. Tabelle1 und Tabelle2 sehen so zwar gleich aus, aber die restlichen Felder sind total verschieden, deshalb hab ich mich entschieden, 2 Tabellen dafür zu nehmen

          oder ist es einfacher, wenn ich für die Kommentare auch 2 verschiedene Tabellen nehme?
          ich bräuchte dann aber das Ergebnis wider zusammengewürfelt :)

          genutzer wird MySQL 4.0.22
          mich würde auch interessieren, wie ich das mit MDB_QueryTool hinbekommen würde

          ich hoffe, dass diese Erklärung jetzt etwas besser ist, falls noch Fragen bestehen, versuche ich die so gut wie möglich zu beantworten

          mfg
          Twilo

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

            jetzt sollte nur Kommentar 1 ausgegeben werden

            Kommentar 1?
            meinst du _id=1 oder _setcard_id=1 ?

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

            welchen Status hat bei dir freigeschaltet und gelöscht?

            ps. Tabelle1 und Tabelle2 sehen so zwar gleich aus, aber die restlichen Felder sind total verschieden, deshalb hab ich mich entschieden, 2 Tabellen dafür zu nehmen

            »»

            tut zunächst nichts zur Sache! du wirst dir schon deine Gedanken gemacht haben!

            oder ist es einfacher, wenn ich für die Kommentare auch 2 verschiedene Tabellen nehme?
            ich bräuchte dann aber das Ergebnis wider zusammengewürfelt :)

            »»

            ich kenne den Hintergrund deines Vorhabens nicht! du selbst musst einplanen, wie groß dieses "Projekt" wird und entscheiden, welche Aufteilung auf Dauer die Beste ist.

            genutzer wird MySQL 4.0.22

            war reine Neugiert :-)

            mich würde auch interessieren, wie ich das mit MDB_QueryTool hinbekommen würde

            ist das ein Tool um sich SQL-Statement im Baukastenprinzip zusammen zu setzen? wenn ja, halte ich davon relativ wenig... es geht nichts über Freehand-SQL !

            ich hoffe, dass diese Erklärung jetzt etwas besser ist, falls noch Fragen bestehen, versuche ich die so gut wie möglich zu beantworten

            ein paar Fragen sind ja noch offen... bis dann!

            Viele Grüße,
            coolblue

            --

            never say oops after you submitted a job :-)
            _der_Ton_macht_die_Musik_!!!_
            1. Hallo,

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

              jetzt sollte nur Kommentar 1 ausgegeben werden

              Kommentar 1?
              meinst du _id=1 oder _setcard_id=1 ?

              _id = 1

              da bei den anderen (ereignissen/anzeigen) die Kreterien nicht passen (freigeschaltet/gelöscht)

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

              welchen Status hat bei dir freigeschaltet und gelöscht?

              Freigeschaltet = 1
              Gelöscht = 1
              nicht Freigeschaltet = 0
              nicht gelöscht = 0

              ps. Tabelle1 und Tabelle2 sehen so zwar gleich aus, aber die restlichen Felder sind total verschieden, deshalb hab ich mich entschieden, 2 Tabellen dafür zu nehmen
              tut zunächst nichts zur Sache! du wirst dir schon deine Gedanken gemacht haben!

              ich wollte das schon mal vorweg sagen, nicht das nachher jemand sagt, pack doch beides in einer Tabelle, da es identisch aussieht :)

              oder ist es einfacher, wenn ich für die Kommentare auch 2 verschiedene Tabellen nehme?
              ich bräuchte dann aber das Ergebnis wider zusammengewürfelt :)

              ich kenne den Hintergrund deines Vorhabens nicht! du selbst musst einplanen, wie groß dieses "Projekt" wird und entscheiden, welche Aufteilung auf Dauer die Beste ist.

              ich möchte auf der Startseite die letzten 10 Kommentare ausgeben lassen
              es ist egal, ob sie von den Ereignissen oder von den Anzeigen kommen,
              es sollen halt die letzten 10 ausgegeben werden

              genutzer wird MySQL 4.0.22

              war reine Neugiert :-)

              ok, ich dachte, das hat jetzt etwas damit zu tun :)

              mich würde auch interessieren, wie ich das mit MDB_QueryTool hinbekommen würde

              ist das ein Tool um sich SQL-Statement im Baukastenprinzip zusammen zu setzen?

              ja

              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 :)

              ich hoffe, dass diese Erklärung jetzt etwas besser ist, falls noch Fragen bestehen, versuche ich die so gut wie möglich zu beantworten

              ein paar Fragen sind ja noch offen... bis dann!

              die wurden ja jetzt hoffentlich geklärt :)

              schon mal danke für deien Mühe

              mfg
              Twilo

              1. 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_!!!_
                1. Hallo,

                  dieses Select gibt mir jetzt die Kommentare aus, die  ich auch erwarte :-)
                  es hat nur das _distinct_ gefehlt :-(

                  bei dein 2. Select bekam ich _kein_ Ergebnis

                  where    a.id=b.id

                  sieht für mich auch etwas falsch aus, da die ID mit den Kommentaren stimmen muss :-)

                  aber danke nochmal =)

                  der Ansatz von mir war ja richtig, nur an der Ausführung hat es gehappert :)

                  mfg
                  Twilo

                  1. Hallo,

                    funktioniert doch nicht so, wie es soll ;-(

                    DROP TABLE IF EXISTS kommentare;
                    CREATE TABLE IF NOT EXISTS kommentare (
                      \_id int(11) unsigned NOT NULL auto_increment,
                      \_setcard\_id int(11) NOT NULL default '0',
                      \_art varchar(255) NOT NULL default '',
                      PRIMARY KEY  (\_id)
                    ) TYPE=MyISAM AUTO_INCREMENT=9 ;

                    INSERT INTO kommentare VALUES (1, 1, 'anzeige');
                    INSERT INTO kommentare VALUES (2, 2, 'anzeige');
                    INSERT INTO kommentare VALUES (3, 1, 'ereignis');
                    INSERT INTO kommentare VALUES (4, 3, 'anzeige');
                    INSERT INTO kommentare VALUES (5, 2, 'ereignis');
                    INSERT INTO kommentare VALUES (6, 4, 'anzeige');
                    INSERT INTO kommentare VALUES (7, 3, 'ereignis');
                    INSERT INTO kommentare VALUES (8, 3, 'ereignis');

                    DROP TABLE IF EXISTS tabelle1;
                    CREATE TABLE IF NOT EXISTS tabelle1 (
                      \_id int(11) unsigned NOT NULL auto_increment,
                      \_freigeschaltet enum('0','1') NOT NULL default '0',
                      \_geloescht enum('0','1') NOT NULL default '0',
                      PRIMARY KEY  (\_id)
                    ) TYPE=MyISAM COMMENT='anzeige' AUTO_INCREMENT=5 ;

                    INSERT INTO tabelle1 VALUES (1, '', '');
                    INSERT INTO tabelle1 VALUES (2, '1', '');
                    INSERT INTO tabelle1 VALUES (3, '', '1');
                    INSERT INTO tabelle1 VALUES (4, '1', '1');

                    DROP TABLE IF EXISTS tabelle2;
                    CREATE TABLE IF NOT EXISTS tabelle2 (
                      \_id int(11) unsigned NOT NULL auto_increment,
                      \_freigeschaltet enum('0','1') NOT NULL default '0',
                      \_geloescht enum('0','1') NOT NULL default '0',
                      PRIMARY KEY  (\_id)
                    ) TYPE=MyISAM COMMENT='ereignis' AUTO_INCREMENT=5 ;

                    INSERT INTO tabelle2 VALUES (1, '1', '1');
                    INSERT INTO tabelle2 VALUES (2, '', '1');
                    INSERT INTO tabelle2 VALUES (3, '1', '');
                    INSERT INTO tabelle2 VALUES (4, '', '');

                    jetzt sollen Kommentare 2, 7 und 8 ausgegeben werden

                    Kommentar 2 gehört zur Tabelle1 Eintrag 2
                    Eintrag 2 ist freigeschaltet und nicht gelöscht

                    Kommentar 7 und 8 gehören zur Tabelle2 Eintrag 3
                    Eintrag 3 ist freigeschaltet und nicht gelöscht

                    die anderen Kommentare dürfen nicht ausgegeben werden, da die Bedingungen nicht erfüllt sind

                    mfg
                    Twilo