Twilo: für mich z.Z. zu komplizierte Abfrage

Hallo,

meine Datenbank

Tabelle1     Tabelle2
+------------+------------+
| _id        | _id        |
| _parent_id | _user_id   |
| ...        | ...        |
+------------+------------+

ich brauche eine Datenbankabfrage in MySQL

ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen

ist das überhaupt möglich?

mfg
Twilo

  1. Moin!

    Tabelle1     Tabelle2
    +------------+------------+
    | _id        | _id        |
    | _parent_id | _user_id   |
    | ...        | ...        |
    +------------+------------+

    ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
    danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen

    $sql = "select b._user_id from tabelle1 a, tabelle2 b where a._parent_id = $uebergabe AND b._id = a._id";

    Lese dazu noch:http://dev.mysql.com/doc/mysql/de/JOIN.html

    tschüssi
    ichen

    1. Hallo,

      Tabelle1     Tabelle2
      +------------+------------+
      | _id        | _id        |
      | _parent_id | _user_id   |
      | ...        | ...        |
      +------------+------------+

      ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
      danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen

      $sql = "select b._user_id from tabelle1 a, tabelle2 b where a._parent_id = $uebergabe AND b._id = a._id";

      Lese dazu noch:http://dev.mysql.com/doc/mysql/de/JOIN.html

      das kann die Lösung nicht sein, ich bekomme viel zu wenig Datensätze

      Tabelle1                      Tabelle2
      _id   _parent_id              _id   _user_id
      1     1                       1     9
      6     1                       2     6
      7     1                       3     1
      8     7                       4     1
      9     6                       5     1
      10    1                       6     1
      11    1                       7     1
      12    1                       8     1
      13    1                       9     1
                                    10    1
                                    11    6

      wenn ich jetzt als _parent_id 1 angebe, muss ich aus Tabelle2 alle Datensätze bekommen
      gebe ich aber als _parent_id 6 an, darf ich aus der Tabelle2 nur den Datenatz 1 bekommen
      wenn ich 7 angebe, darf kein Datenatz zurückgegeben werden

      mfg
      Twilo

      1. Hallo,

        Datensatz 2 und 11 müssen bei _parent_id 6 auch ausgegeben werden

        mfg
        Twilo

        1. Du weißt schon, was Du willst... Oder?

          Hast Du evtl. parent_id und user_id verwechselt?

          1. Hallo,

            Du weißt schon, was Du willst... Oder?

            ja ;-)

            Hast Du evtl. parent_id und user_id verwechselt?

            wenn parent_id übergeben wird, würde ja eigentlich nur der Datensatz 9 aus Tabelle2 kommen
            aber der User 6 hat auch 2 Beiträge erstellt, die sollen natürlich auch ausgegeben werden

            mfg
            Twilo

    2. yo,

      $sql = "select b._user_id from tabelle1 a, tabelle2 b where a._parent_id = $uebergabe AND b._id = a._id";

      select a._id, b._user_id
      from tabelle1 a, tabelle2 b
      where a._parent_id = $uebergabe
      AND b._user_id = a._id";

      Ilja

      1. Hallo,

        select a._id, b._user_id
        from tabelle1 a, tabelle2 b
        where a._parent_id = $uebergabe
        AND b._user_id = a._id";

        das sieht schon super aus
        hab es etwas abgeändert

        select b._id, b._user_id
        from tabelle1 a, tabelle2 b
        where a._parent_id = 6
        AND b._user_id = a._id

        dann gibt er alle aus, wo _parent_id = 6 ist
        also Datensatz 9

        ich bräuchte aber noch Datensatz 2 und 11
        https://forum.selfhtml.org/?t=96456&m=586738

        dann hab ich es so probiert

        select b._id, b._user_id
        from tabelle1 a, tabelle2 b
        where (a._parent_id = $uebergabe
        AND b._user_id = a._id) OR b._user_id = 6

        nur, was er mir da ausgibt, ist totaler Mist
        insgesammt 37 Datensätze
        es dürfen eigentlich nur 3 sein

        sieht ganz nach einer Kreuzverbindung aus...

        mfg
        Twilo

        1. yo,

          meiner meinung nach widersprichst du dir in deinen aussagen.

          1. ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
            danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen

          genau das sollte die abfrage liefern, die ich dir gegeben habe.

          1. ich bräuchte aber noch Datensatz 2 und 11

          und das widerspricht deinem ersten wunsch. dieser 2. und 11. datensatz weißt auf den ---> user <--- 6 und nicht auf die user, die als parent_id 6 haben.

          zum anderen hast du innerhalb der ersten tabelle eine rekursion, die man nach möglichkeit vermeiden sollte.

          Ilja

          1. Hallo,

            meiner meinung nach widersprichst du dir in deinen aussagen.

            1. ich habe/bekomme "_parent_id" damit muss ich aus Tabelle1 die _id's Abfragen, wo _parent_id = der übergeben id ist
              danach muss/brauch ich dann aus der Tabelle2 die ganzen Datensätze, wo die _user_id mit den _id's aus der Tabelle1 übereinstimmen

            in der Abfrage sollen beide Varianten berücksichtigt werden

            genau das sollte die abfrage liefern, die ich dir gegeben habe.

            ja, ich bekomme den Datensatz 9, brauche aber dazu noch den Dytensatz 2 und 11

            den Datensatz 9 hat ein User vom User 6 erstellt
            Datensatz 2 und 11 hat der User 6 erstellt

            1. ich bräuchte aber noch Datensatz 2 und 11

            und das widerspricht deinem ersten wunsch. dieser 2. und 11. datensatz weißt auf den ---> user <--- 6 und nicht auf die user, die als parent_id 6 haben.

            mit der Abfrage sollen alle Datensätze abgerufen werden, die ihm gehören bzw. einen User von Ihm gehört

            zum anderen hast du innerhalb der ersten tabelle eine rekursion, die man nach möglichkeit vermeiden sollte.

            wie meinst du das?
            die erste Tabelle enthält die User
            _parent_id gibt an, welcher User diesen User erstellt hat

            wie kann ich das denn anders lösen?

            mfg
            Twilo

            1. yo,

              ja, ich bekomme den Datensatz 9, brauche aber dazu noch den Dytensatz 2 und 11

              gut, das war aus deinem ursprungsposting nicht ganz klar hervorgegangen.

              die erste Tabelle enthält die User
              _parent_id gibt an, welcher User diesen User erstellt hat

              genau das nennt man eine rekursion.

              ich werde mich noch mal einen anderen tag melden, gehe nun ins kino, freundin ist hier und wir sehen einen typischen frauenfilm.....

              Ilja

              1. Hallo,

                ja, ich bekomme den Datensatz 9, brauche aber dazu noch den Dytensatz 2 und 11

                gut, das war aus deinem ursprungsposting nicht ganz klar hervorgegangen.

                ich hab mich dort etwas unklar ausgedrückt :-(

                die erste Tabelle enthält die User
                _parent_id gibt an, welcher User diesen User erstellt hat

                genau das nennt man eine rekursion.

                ich werde mich noch mal einen anderen tag melden,

                hier über's Forum, oder per eMail?

                gehe nun ins kino, freundin ist hier und wir sehen einen typischen frauenfilm.....

                dann mal viel spass :-P

                mfg
                Twilo

                1. yo,

                  du hast bei deinem ersten versuch die klammern falsch gesetzt, AND bindet stärker als OR.

                  select b._id, b._user_id
                  from tabelle1 a, tabelle2 b
                  where (a._parent_id = 6 OR a._id= 6)
                  AND b._user_id = a._id

                  Ilja

                  1. Hallo,

                    du hast bei deinem ersten versuch die klammern falsch gesetzt, AND bindet stärker als OR.

                    select b._id, b._user_id
                    from tabelle1 a, tabelle2 b
                    where (a._parent_id = 6 OR a._id= 6)
                    AND b._user_id = a._id

                    das klappt so weit, hat aber noch einen kleinen Schönheitsfehler

                    z.B. User 9 hat ein Beitrag erstellt
                    diese Beiträge werden zur Zeit nicht angezeigt.

                    User 9 gehört nicht zu User 6 sondern zu User 8
                    User 8 gehört aber zu User 6

                    User 9 soll auch angezeigt werden

                    das meintest du sicherlich mit Rekursiv, oder?
                    wie kann man das am besten lösen?

                    mfg
                    Twilo

                    1. yo,

                      das meintest du sicherlich mit Rekursiv, oder?

                      ja, das ist rekursiv und insofern wird auch die abfrage rekursiv sein müssen. frage mich nur, warum du das nicht gleich erwähnt hast.

                      wie kann man das am besten lösen?

                      wenn es möglich ist, das daten-design so ändern, dass keine rekursion mehr vorhanden ist.

                      Ilja

                      1. Hallo,

                        wie kann man das am besten lösen?

                        wenn es möglich ist, das daten-design so ändern, dass keine rekursion mehr vorhanden ist.

                        ich frage mich gerade, wie ich das anstellen soll ;-)

                        User1
                          |
                          +-- User2
                          |
                          +-- User3
                          |     |
                          |     +-- User8
                          |     |     |
                          |     |     + User12
                          |     |
                          |     +-- User9
                          |     |
                          |     +-- ....
                          |
                          +-- User15
                          |     |

                        etc.

                        also User1 hat User2, User3, User15, etc. erstellt
                        diese User können auch User erstellen

                        wie würdest du das Datenbank Design machen?

                        mfg
                        Twilo

                        1. yo,

                          ich frage mich gerade, wie ich das anstellen soll ;-)

                          gute frage und bei rekursionen tue ich mich auch immer schwer. aber mein vorschläg wäre, welcher User welchen User erstellt hat in eine extra tabelle auszugliedern. dann hättest du deine normale User tabelle, in der die spalte mit den "überuser" wegfällt plus einer neuen tabellen, in der du zwei spalten hast, die zusammen einen PK bilden.

                          tabelle 2:

                          User | wurde_erstelt_von_User

                          dann sollte eigentlich die rekursion draussen sein und auch die abfrage besser zu bewerkstelligen sein.

                          Ilja

                          1. Hallo,

                            [...]
                            dann hättest du deine normale User tabelle, in der die spalte mit den "überuser" wegfällt plus einer neuen tabellen, in der du zwei spalten hast, die zusammen einen PK bilden.

                            was ist ein PK?

                            tabelle 2:

                            User | wurde_erstelt_von_User

                            dann sollte eigentlich die rekursion draussen sein und auch die abfrage besser zu bewerkstelligen sein.

                            die Rekursion besteht dann aber immer noch, oder?
                            denn ich würde diese eine Spalte ja nur ein eine neue Tabelle packen

                            oder hab ich ein Denkfehler?

                            mfg
                            Twilo

                            1. yo,

                              was ist ein PK?

                              primary key, bzw. primärschlüssel.

                              die Rekursion besteht dann aber immer noch, oder?

                              direkte rekursion in einer tabelle wäre, dass zwei spalten in unterschiedlichen zeilen voneinander abhängig sind. beispiel, der datensatz eines user in deinem daten-design hat einen verweis auf seinen ersteller. und dieser ersteller steht in einem anderen datensatz der gleichen tabelle. wenn du alles in eine zweite tabelle auslagerst, sollte die rekursion eigentlich nicht mehr vorhanden sein. aber wie gesagt, bei rekursionen tue ich mich auch immer schwer.

                              denn ich würde diese eine Spalte ja nur ein eine neue Tabelle packen

                              diese eine spalte plus eine weitere mit den user_id.

                              Ilja

                              1. Hallo,

                                direkte rekursion in einer tabelle wäre, dass zwei spalten in unterschiedlichen zeilen voneinander abhängig sind. beispiel, der datensatz eines user in deinem daten-design hat einen verweis auf seinen ersteller. und dieser ersteller steht in einem anderen datensatz der gleichen tabelle. wenn du alles in eine zweite tabelle auslagerst, sollte die rekursion eigentlich nicht mehr vorhanden sein. aber wie gesagt, bei rekursionen tue ich mich auch immer schwer.

                                hm...
                                diese Zusätzliche Tabelle würde doch so aussehen, oder?

                                +----------+------------+
                                | _user_id | _parent_id |
                                +----------+------------+
                                |    1     |     1      |
                                |    6     |     1      |
                                |    7     |     1      |
                                |    8     |     7      |
                                |    9     |     6      |
                                |    10    |     1      |
                                |    11    |     1      |
                                |    12    |     1      |
                                |    13    |     1      |
                                +----------+------------+

                                aber genauso sieht doch auch die andere Tabelle aus
                                irgendwie versteh ich das nicht :-(

                                mfg
                                Twilo

                                1. yo,

                                  diese Zusätzliche Tabelle würde doch so aussehen, oder?

                                  ja, genau so.

                                  aber genauso sieht doch auch die andere Tabelle aus
                                  irgendwie versteh ich das nicht :-(

                                  nicht ganz, die rekursion ist nun hoffentlich draussen, da user und ersteller voneinander getrennt sind. die abhängigkeiten befinden sich nun in zwei tabellen.

                                  Ilja

                                  1. Hallo,

                                    diese Zusätzliche Tabelle würde doch so aussehen, oder?

                                    ja, genau so.

                                    aber genauso sieht doch auch die andere Tabelle aus
                                    irgendwie versteh ich das nicht :-(

                                    nicht ganz, die rekursion ist nun hoffentlich draussen, da user und ersteller voneinander getrennt sind. die abhängigkeiten befinden sich nun in zwei tabellen.

                                    die Rekursion ist dann aber nicht aus der Welt geschaft, sondern nur in eine andere Tabelle ausgelagert *g*

                                    der Inhalt aus der extra Tabelle, wurde 1:1 aus der anderen übernommen

                                    hm...

                                    mfg
                                    Twilo

                                    1. yo,

                                      die Rekursion ist dann aber nicht aus der Welt geschaft, sondern nur in eine andere Tabelle ausgelagert *g*

                                      die direkte rekursion ist es allemal, den diese ist immer nur innhalb einer tabelle. die frage ist, ob eine indirekte rekursion vorliegt. und auch das sollte nicht mehr der fall sein.

                                      Ilja

                                      1. Hallo,

                                        die Rekursion ist dann aber nicht aus der Welt geschaft, sondern nur in eine andere Tabelle ausgelagert *g*

                                        die direkte rekursion ist es allemal, den diese ist immer nur innhalb einer tabelle. die frage ist, ob eine indirekte rekursion vorliegt. und auch das sollte nicht mehr der fall sein.

                                        doch die liegt imemr noch vor :)

                                        ich werde mal bei Zeiten etwas googlen, vielleicht find ich ja etwas, wie man das am besten lösen kann

                                        mfg
                                        Twilo