Ankündigung

Einklappen
Keine Ankündigung bisher.

Daten aus zwei Tabellen selektieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Daten aus zwei Tabellen selektieren

    Hallo Zusammen

    Ich habe ein Problem Daten aus zwei Tabellen richtig zu selektieren.

    Tabellen

    Listen
    listen_id
    listen_beschreibung
    listen_name
    besitzer

    ListenAbo
    listenAbo_id
    user_id
    listen_id

    Andere User können Listen von anderen User Abonnieren.
    Ich will jetzt dem User seine und die abonnierten Listen ausgeben.

    Wie schaffe ich es mit einem SELECT-Abrage?

    Ich habe mal was ausprobiert:

    SELECT Listen.*, ListenAbo.listen_id FROM Listen, ListenAbo WHERE Listen.besitzer =2 or Listen.listen_id = ListenAbo.listen_id and ListenAbo.user_id =2

    Ich bekomme die richtigen Datensätze, aber die von der Tabelle Listen bekomme ich doppelt.

    Ich wäre froh wenn ihr mir da weiter helfen könnt

    Lg Leo

  • #2
    Zitat von leo.sobe Beitrag anzeigen

    Ich bekomme die richtigen Datensätze, aber die von der Tabelle Listen bekomme ich doppelt.

    Ich wäre froh wenn ihr mir da weiter helfen könnt

    Lg Leo

    Du bist schon nah dran. Du machst 'aus Versehen' einen Cross Join, suchst aber einen Left Join. Verwende saubere expliziete Join-Syntax und alles wird gut.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Zitat von akretschmer Beitrag anzeigen
      Du bist schon nah dran. Du machst 'aus Versehen' einen Cross Join, suchst aber einen Left Join. Verwende saubere expliziete Join-Syntax und alles wird gut.
      Ich habe mir das mit dem Left Join angeschaut, aber ich versteh's nicht, wie ich das bei mir umsetzen soll.

      Kommentar


      • #4
        Zitat von leo.sobe Beitrag anzeigen
        Ich habe mir das mit dem Left Join angeschaut, aber ich versteh's nicht, wie ich das bei mir umsetzen soll.
        Wenn 3 Minuten nicht reichen, dann schau es Dir länger an.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Zitat von akretschmer Beitrag anzeigen
          Wenn 3 Minuten nicht reichen, dann schau es Dir länger an.
          Ich bin alle Möglichkeiten durchgegangen, aber es will nicht funktionieren:

          SELECT Listen.*, ListenAbo.user_id FROM Listen LEFT JOIN ListenAbo ON ListenAbo.user_id = 2 AND besitzer = 2

          SELECT Listen.*, ListenAbo.user_id FROM Listen LEFT JOIN ListenAbo ON ListenAbo.user_id = 2 OR besitzer = 2

          SELECT Listen.*, ListenAbo.user_id FROM Listen LEFT JOIN ListenAbo ON ListenAbo.listen_id = Listen.listen_id AND besitzer = 2 AND ListenAbo.user_id = 2

          Ich bekommen nicht das gewünschte Ergebnis.

          So würde es auch gehen, aber es ist halt nicht elegant:

          SELECT * FROM `Listen` WHERE 1

          SELECT * FROM `ListenAbo` WHERE user_id = 2 dann die Listen_id nehmen und und die Information suchen (Name usw) für alle Datensätze die sich in der Tabelle ListenAbo befinden.

          Kommentar


          • #6
            Zitat von leo.sobe Beitrag anzeigen
            Ich bin alle Möglichkeiten durchgegangen, aber es will nicht funktionieren:

            SELECT Listen.*, ListenAbo.user_id FROM Listen LEFT JOIN ListenAbo ON ListenAbo.user_id = 2 AND besitzer = 2

            SELECT Listen.*, ListenAbo.user_id FROM Listen LEFT JOIN ListenAbo ON ListenAbo.user_id = 2 OR besitzer = 2

            SELECT Listen.*, ListenAbo.user_id FROM Listen LEFT JOIN ListenAbo ON ListenAbo.listen_id = Listen.listen_id AND besitzer = 2 AND ListenAbo.user_id = 2

            Ich bekommen nicht das gewünschte Ergebnis.

            So würde es auch gehen, aber es ist halt nicht elegant:

            SELECT * FROM `Listen` WHERE 1

            SELECT * FROM `ListenAbo` WHERE user_id = 2 dann die Listen_id nehmen und und die Information suchen (Name usw) für alle Datensätze die sich in der Tabelle ListenAbo befinden.
            Trenne Join-Condition und Where-Condition:

            Code:
            test=# create table listen(id int primary key, name text);
            CREATE TABLE
            
            test=*# copy listen from stdin;
            Enter data to be copied followed by a newline.
            End with a backslash and a period on a line by itself.
            >> 1    liste1
            >> 2    liste2
            >> 3    liste3
            >> \.
            
            test=*# create table listen_abo(id int primary key, listen_id int references listen, user_id int);
            CREATE TABLE
            
            test=*# copy listen_abo from stdin;
            Enter data to be copied followed by a newline.
            End with a backslash and a period on a line by itself.
            >> 1    1       1
            >> 2    2       1
            >> 3    2       2
            >> 4    3       2
            >> 5    3       1
            >> \.
            
            test=*# select listen.id, listen.name from listen left join listen_abo on listen.id=listen_abo.listen_id where listen_abo.user_id = 2;
             id |  name
            ----+--------
              2 | liste2
              3 | liste3
            (2 rows)
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Zitat von akretschmer Beitrag anzeigen
              Trenne Join-Condition und Where-Condition:

              Code:
              test=# create table listen(id int primary key, name text);
              CREATE TABLE
              
              test=*# copy listen from stdin;
              Enter data to be copied followed by a newline.
              End with a backslash and a period on a line by itself.
              >> 1    liste1
              >> 2    liste2
              >> 3    liste3
              >> \.
              
              test=*# create table listen_abo(id int primary key, listen_id int references listen, user_id int);
              CREATE TABLE
              
              test=*# copy listen_abo from stdin;
              Enter data to be copied followed by a newline.
              End with a backslash and a period on a line by itself.
              >> 1    1       1
              >> 2    2       1
              >> 3    2       2
              >> 4    3       2
              >> 5    3       1
              >> \.
              
              test=*# select listen.id, listen.name from listen left join listen_abo on listen.id=listen_abo.listen_id where listen_abo.user_id = 2;
               id |  name
              ----+--------
                2 | liste2
                3 | liste3
              (2 rows)
              Also das heisst:
              Wenn ein User eine neue Liste erstellt Abonniert er sie.

              Ich habe gedacht das nur die Listen die er von den anderen User abonniert hat, kommen in der Tabelle ListenAbo.

              Kommentar


              • #8
                Wenn du es wir ursprünglich angedacht machen willst kannst du das per UNION machen UNION (einmal die eigenen listen, einmal die abos), oder du musst den JOIN recht umständlich formulieren. Wenn ich nicht grade ein Knoten im Kopf habe sieht der dann so aus:

                PHP-Code:
                SELECT
                    listen
                .*
                FROM
                    listen LEFT JOIN
                    listen_abo ON 
                (listen.id listen_abo.listen_id AND listen_abo.user_id 2)
                WHERE
                    
                (listen.user_id AND listen_abo.user_id IS NULL) OR
                    
                listen_abo.user_id 

                Kommentar


                • #9
                  Zitat von erc Beitrag anzeigen
                  Wenn du es wir ursprünglich angedacht machen willst kannst du das per UNION machen UNION (einmal die eigenen listen, einmal die abos), oder du musst den JOIN recht umständlich formulieren. Wenn ich nicht grade ein Knoten im Kopf habe sieht der dann so aus:

                  PHP-Code:
                  SELECT
                      listen
                  .*
                  FROM
                      listen LEFT JOIN
                      listen_abo ON 
                  (listen.id listen_abo.listen_id AND listen_abo.user_id 2)
                  WHERE
                      
                  (listen.user_id AND listen_abo.user_id IS NULL) OR
                      
                  listen_abo.user_id 
                  Vielen herzlichen Dank für deine Hilfe, es funktioniert tiptop.

                  Lg Leo

                  Kommentar

                  Lädt...
                  X