Ankündigung

Einklappen
Keine Ankündigung bisher.

Lösung für eine SQL Select

Einklappen

Neue Werbung 2019

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

  • Lösung für eine SQL Select

    Hallo zusammen,

    meine SQL Kenntnisse sind ein wenig eingerostet.
    Ich habe folgende Tabellen mit entsprechenden Feldern:
    - Spieler
    -- Vorname
    -- Nachname

    - Training
    -- Datum

    - Spieler_Training
    -- Spieler_ID
    -- Training_ID
    -- Besuch

    Ich benötige jetzt folgende Daten: Grundsätzlich sollen alle Spieler angezeigt werden. Ich benötige aber als Einschränkung das Feld Besuch von einem bestimmten Tag.

    Der Select
    Code:
     SELECT *  FROM Spieler  LEFT JOIN spieler_training  ON spieler.id = spieler_training.spieler_id  WHERE spieler_training.training_id = 2
    Liefert mir nur die Spieler die an dem bestimmten Training teilgenommen haben. Ich möchte aber alle Spieler haben, aber mit dem entsprechenden Feld Hinweis.
    Sprich es soll ersichtlich sein, wer an diesem Tag an dem Training teilgenommen hat.

    Datenbank ist PostgreSQL falls das eine Rolle spielt.
    Kann mir jemand einen Ansatz geben?

    Vielen Dank vorab.


  • #2
    "Besuch" ist DATE? Oder BOOL, ob er teilnahm? Falls ja, ist das natürlich Murks, denn Du brauchst nur die da einzutragen, die teilnahmen. Training hat auch eine ID?

    Was genau hast denn bisher versucht? Du wirst alle3 Tabellen wohl joinen müssen...
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Zitat von kaptainIglo Beitrag anzeigen
      Ich benötige jetzt folgende Daten: Grundsätzlich sollen alle Spieler angezeigt werden. Ich benötige aber als Einschränkung das Feld Besuch von einem bestimmten Tag.
      Die Zusammenfassung bringt nicht wirklich viel^^'

      Kannst du ein paar Beispieldaten und das gewünschte Ergebnis posten?
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Code:
        test=*# select * from spieler;
         id |   name    
        ----+-----------
          1 | spieler 1
          2 | spieler 2
        (2 Zeilen)
        
        test=*# select * from training ;
         id |   datum    
        ----+------------
          1 | 2018-01-01
          2 | 2018-07-01
        (2 Zeilen)
        
        test=*# select * from spieler_training ;
         id_spieler | training_id
        ------------+-------------
                  1 |           1
                  2 |           2
        (2 Zeilen)
        
        test=*# \d spieler;
                           Tabelle »public.spieler«
         Spalte |   Typ   | Sortierfolge | NULL erlaubt? | Vorgabewert
        --------+---------+--------------+---------------+-------------
         id     | integer |              | not null      |
         name   | text    |              |               |
        Indexe:
            "spieler_pkey" PRIMARY KEY, btree (id)
        Fremdschlüsselverweise von:
            TABLE "spieler_training" CONSTRAINT "spieler_training_id_spieler_fkey" FOREIGN KEY (id_spieler) REFERENCES spieler(id)
        
        test=*# \d spieler_training
                         Tabelle »public.spieler_training«
           Spalte    |   Typ   | Sortierfolge | NULL erlaubt? | Vorgabewert
        -------------+---------+--------------+---------------+-------------
         id_spieler  | integer |              |               |
         training_id | integer |              |               |
        Fremdschlüssel-Constraints:
            "spieler_training_id_spieler_fkey" FOREIGN KEY (id_spieler) REFERENCES spieler(id)
            "spieler_training_training_id_fkey" FOREIGN KEY (training_id) REFERENCES training(id)
        
        test=*#
        test=*#
        test=*# select s.name, t.datum, case when t.datum = '2018-01-01' then '*' else '' end as teilgenommen from spieler s left join spieler_training st on s.id=st.id_spieler left join training t on st.training_id=t.id;
           name    |   datum    | teilgenommen
        -----------+------------+--------------
         spieler 1 | 2018-01-01 | *
         spieler 2 | 2018-07-01 |
        (2 Zeilen)
        
        test=*#
        Suchst Du sowas?
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Zitat von akretschmer Beitrag anzeigen
          "Besuch" ist DATE? Oder BOOL, ob er teilnahm? Falls ja, ist das natürlich Murks, denn Du brauchst nur die da einzutragen, die teilnahmen. Training hat auch eine ID?

          Was genau hast denn bisher versucht? Du wirst alle3 Tabellen wohl joinen müssen...
          Besuch könnte sein Teilnahme, Entschuldigt, Krank, Unentschuldigt.
          Ich hoffe das macht dann Sinn?

          Kommentar


          • #6
            Zitat von akretschmer Beitrag anzeigen
            Code:
            test=*# select * from spieler;
            id | name
            ----+-----------
            1 | spieler 1
            2 | spieler 2
            (2 Zeilen)
            
            test=*# select * from training ;
            id | datum
            ----+------------
            1 | 2018-01-01
            2 | 2018-07-01
            (2 Zeilen)
            
            test=*# select * from spieler_training ;
            id_spieler | training_id
            ------------+-------------
            1 | 1
            2 | 2
            (2 Zeilen)
            
            test=*# \d spieler;
            Tabelle »public.spieler«
            Spalte | Typ | Sortierfolge | NULL erlaubt? | Vorgabewert
            --------+---------+--------------+---------------+-------------
            id | integer | | not null |
            name | text | | |
            Indexe:
            "spieler_pkey" PRIMARY KEY, btree (id)
            Fremdschlüsselverweise von:
            TABLE "spieler_training" CONSTRAINT "spieler_training_id_spieler_fkey" FOREIGN KEY (id_spieler) REFERENCES spieler(id)
            
            test=*# \d spieler_training
            Tabelle »public.spieler_training«
            Spalte | Typ | Sortierfolge | NULL erlaubt? | Vorgabewert
            -------------+---------+--------------+---------------+-------------
            id_spieler | integer | | |
            training_id | integer | | |
            Fremdschlüssel-Constraints:
            "spieler_training_id_spieler_fkey" FOREIGN KEY (id_spieler) REFERENCES spieler(id)
            "spieler_training_training_id_fkey" FOREIGN KEY (training_id) REFERENCES training(id)
            
            test=*#
            test=*#
            test=*# select s.name, t.datum, case when t.datum = '2018-01-01' then '*' else '' end as teilgenommen from spieler s left join spieler_training st on s.id=st.id_spieler left join training t on st.training_id=t.id;
            name | datum | teilgenommen
            -----------+------------+--------------
            spieler 1 | 2018-01-01 | *
            spieler 2 | 2018-07-01 |
            (2 Zeilen)
            
            test=*#
            Suchst Du sowas?
            Ja, das geht in die richtige Richtung.
            Allerdings erhalte ich die ganze Auflistung der ganzen Trainings.

            Ich müsste die Auswertung pro Training haben:
            PHP-Code:
              name    |   datum    teilgenommen
             
            -----------+------------+--------------  
             
            spieler 1 2018-02-02 | *  
             
            spieler 2 2018-02-02 |  
             
            spieler 3 2018-02-02 | *  
             
            spieler 4 2018-02-02 |  
             
            spieler 5 2018-02-02 


            Geht das überhaupt oder muss ich die Datenbank anders anlegen?

            Kommentar


            • #7
              mit den von mir schon gezeigten Daten:

              Code:
              test=*# select s.name, t.datum, case when ((st.id_spieler,st.training_id)=(s.id,t.id)) then '*' else '' end as teilgenommen from spieler s cross join training t left join spieler_training st on ((st.id_spieler, st.training_id)=(s.id, t.id));
                 name    |   datum    | teilgenommen
              -----------+------------+--------------
               spieler 1 | 2018-01-01 | *
               spieler 2 | 2018-01-01 |
               spieler 1 | 2018-07-01 |
               spieler 2 | 2018-07-01 | *
              (4 Zeilen)
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Vielen Dank @akretschmer.

                Ich habs nochmal nachvollzogen und mit dem entsprechenden WHERE für das Datum kann ich das wie gewünscht eingrenzen.

                Vielen herzlichen Dank!


                Kommentar

                Lädt...
                X