Ankündigung

Einklappen
Keine Ankündigung bisher.

PostgreSQL: Join klappt nicht.

Einklappen

Neue Werbung 2019

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

  • #16
    Zitat von protestix Beitrag anzeigen
    Stimmt, da es die Auswertung(in Mysql) vereinfacht, jedoch mehr Speicherplatz verbraucht. Da aber in meinen Augen Geschwindigkeit wichtiger ist als Platz entscheide ich mich dafür.
    Wäre dann unter dem Aspekt von kaminbausatz auch die bessere Variante zumal ja bei der Planung der Trainingstermine ein Automatischer Lauf die Kombinationen erzeugen könnte und dann bereits Tests im Hinblick auf die Performance erfolgen könnten (würde ich, auch mit dem Risiko, von kaminbausatz wegen der Eintragung aller Termine gerügt zu werden, vorziehen). Man kann natürlich auch die betr. Datensätze nach jedem Training erzeugen. Die Reihenfolge in der Anwendung wäre dann: 1. Betr. Unterpunkt der Anwendung "Trainingsteilnahme" starten --> 2. Tabelle wird automatisch um alle Kombinationen der zur Teilnahme berechtigten Spieler mit dem betr. Trainingstermin erweitert --> 3. Eintragungen in HTML-Tabelle vornehmen --> 4. Ggfs. Liste der Spieler erweitern um "Freiwillige" (3. und 4. können getauscht werden, sonst jetzt Wiederholung von 3.) --> 5. Ergebnis speichern und ggfs. zu einer Übersicht weiterleiten. Aber da sind wir ja noch lange nicht.

    Kommentar


    • #17
      Ich sitze gerade auf Teneriffa und habe nur mein Handy parat, mal ein etwas anderer Ansatz in SQLite weil mein Galaxy Note 4 hiermit besser umgeht.

      1.) Ich will wissen wer an einem bestimmten Datum da war.

      Code:
      select playername from
        (select playername from
          (select player_id,
            (select rowid from trainings where datum = '2019-02-02') as trainID
             from teilnahme
      where training_id = trainID)
      inner join player on player.rowid = player_id) as playername
      2. Ich will wissen wer nicht da war, hier genügt es die anwesenden Player von der Liste der Player abzuziehen...

      Code:
      select playername from player
      except
      select playername from
        (select playername from
          (select player_id,
            (select rowid from trainings where datum = '2019-01-01') as trainID
             from teilnahme
      where training_id = trainID)
      inner join player on player.rowid = player_id) as playername

      Kommentar


      • #18
        Ich muss dann doch noch mal schreiben, dachte wär alles klar.

        Zitat von Alf2016 Beitrag anzeigen
        ..
        Code:
        SELECT name, trainingsdatum FROM player CROSS JOIN trainings;
        "Brauchen tut's" den nicht, denn es geht ja auch so:
        Code:
        SELECT name, trainingsdatum FROM player, trainings;
        Aber gut, wer gerne viel Schreibarbeit hat...
        Ja, wer hat nicht schon mal das WHERE Clause oder JOIN Clause vergessen, damit lernt man sehr anschaulich, was ein cross join ist.
        Aber schön ist es trotzdem, wenn es da steht. Dann weiß eine dritte Person, dass es wirklich Absicht ist und niemand was vergessen hat.

        Warum es überhaupt cross sein soll und die daraus folgenden Performanceaspekte, verstehe ich allerdings nicht?
        Auch nicht warum Akretschmer mit dem Array kommt, nur weil pg es kann?

        Ok, vielleicht habe ich die Aufgabenstellung nicht verstanden. In Pg wäre es so:
        Code:
        select *
          from player p
          full outer join player_training pt on p.pid = pt.player_id
          full outer join trainings t        on pt.training_id = t.tid
         order by <ReplaceWithWhatEverYouNeed>
        oder mit schicker Extraspalte:
        Code:
        select *,
               case
               when tid is null then 'keine Trainings'
               when pid is null then 'keine Teilnehmer'
                                else ''
               end as generated_remark
          from player p
          full outer join player_training pt on p.pid = pt.player_id
          full outer join trainings t        on pt.training_id = t.tid
        So jetz soll der TE aber endlich sein DM richten.

        * und ja, wir alle wissen, Stern ist böse, hier alles egal und man kann jede Spalte sehen, gefüllt oder null, also was da passiert.

        Kommentar


        • #19
          kaminbausatz
          Mysql kennt mal wieder kein Except und MINUS geht bei vielen auch nicht.
          Sollte erwähnt werden, falls das jemand mit Mysql anstatt Sqlite ausprobiert.

          Kommentar


          • #20
            Zitat von kaminbausatz Beitrag anzeigen
            Ich sitze gerade auf Teneriffa und habe nur mein Handy parat, mal ein etwas anderer Ansatz in SQLite weil mein Galaxy Note 4 hiermit besser umgeht.

            1.) Ich will wissen wer an einem bestimmten Datum da war.

            Code:
            select playername from
            (select playername from
            (select player_id,
            (select rowid from trainings where datum = '2019-02-02') as trainID
            from teilnahme
            where training_id = trainID)
            inner join player on player.rowid = player_id) as playername
            2. Ich will wissen wer nicht da war, hier genügt es die anwesenden Player von der Liste der Player abzuziehen...

            Code:
            select playername from player
            except
            select playername from
            (select playername from
            (select player_id,
            (select rowid from trainings where datum = '2019-01-01') as trainID
            from teilnahme
            where training_id = trainID)
            inner join player on player.rowid = player_id) as playername
            Ist das getestet? Wenn ja, mit welchem Ergebnis?

            Kommentar


            • #21
              Zitat von kaminbausatz Beitrag anzeigen
              1.) Ich will wissen wer an einem bestimmten Datum da war.

              Code:
              select playername from
              (select playername from
              (select player_id,
              (select rowid from trainings where datum = '2019-02-02') as trainID
              from teilnahme
              where training_id = trainID)
              inner join player on player.rowid = player_id) as playername
              Davor zufällig ein paar Cocktails geschlürft? rowid = trainID, rowid = player_id, "select playername from (select playername from", ein Subquery im SELECT auf desen Ergebnis sich das WHERE bezieht... Selbst wenn der Query das richtige Ergebnis liefert, ist das ein brain fuck. Das hilft niemanden weiter. Außerdem ist das in der Form eine 0815 Problemstellung die mit 2 INNER JOINs und WHERE datum erledigt ist.

              Zitat von Perry Staltic Beitrag anzeigen
              Warum es überhaupt cross sein soll und die daraus folgenden Performanceaspekte, verstehe ich allerdings nicht?
              Weil das die Fragestellung so vorgibt. Du willst für jedes Traning wissen, welches Mitgleid anwesend bzw. nicht anwesend war. Da "alle anwesenden Mitglieder" plus "alle nicht anwesenden Mitgleider" gleich alle Mitgleider ist, hast du ein Kreuzprodukt zwischen Traning und Mitgliedern.
              Ob die Fragestellung in der Form sinn macht, sei mal dahin gestellt. (mit ein paar mehr Bedingung kann es sinn machen)

              Zitat von Perry Staltic Beitrag anzeigen
              Auch nicht warum Akretschmer mit dem Array kommt, nur weil pg es kann?
              Weil er "alle anwesenden Mitglieder" + "alle nicht anwesenden Mitgleider" = "alle Mitgleider", bzw. "alle Mitgleider" - "alle anwesenden Mitglieder" = "alle nicht anwesenden Mitgleider" mit dem Array abbildet und daher um das Kreuzprodukt auf Datenbankebene drum rum kommt.

              Zitat von Perry Staltic Beitrag anzeigen
              Ok, vielleicht habe ich die Aufgabenstellung nicht verstanden. In Pg wäre es so:
              Ja, das macht was anderes...

              Kommentar


              • #22
                Zitat von Alf2016 Beitrag anzeigen

                Ist das getestet? Wenn ja, mit welchem Ergebnis?
                Mit dem richtigen.

                @erc

                Riesenwind und keine Lösung...

                Kommentar


                • #23
                  Zitat von erc Beitrag anzeigen
                  Weil das die Fragestellung so vorgibt. Du willst für jedes Traning wissen, welches Mitgleid anwesend bzw. nicht anwesend war. Da "alle anwesenden Mitglieder" plus "alle nicht anwesenden Mitgleider" gleich alle Mitgleider ist, hast du ein Kreuzprodukt zwischen Traning und Mitgliedern.
                  Ob die Fragestellung in der Form sinn macht, sei mal dahin gestellt. (mit ein paar mehr Bedingung kann es sinn machen)
                  Ok, also wenn "Am 2019-10-10 war nur Andreas im Training. Bei den anderen soll NULL stehen." das für Euch so klar eine solche Liste verlangt, in der pro Training jedes Mitglied aufgeführt ist, dann muss es cross join sein. Ich hatte es so verstanden, dass einfach jedes Mitglied und jedes Training erscheinen soll. Nach dem Motto "Karl gibt's auch, aber der war nie da".

                  Sinn macht die Fragestellung auch in der Form, solche Listen und Aushänge sind bei Kursen und Vereinen recht häufig zu sehen

                  Dann also mit cross join:
                  Code:
                  select *,
                         case
                         when training_id is null
                         then 'nicht anwesend'
                         else 'anwesend' end as generated_remark
                    from player p  cross join trainings t
                    left join player_training pt
                           on (t.tid, p.pid) = (pt.training_id,pt.player_id)
                   order by <ReplaceWithWhatEverYouNeed>

                  Kommentar


                  • #24
                    Zitat von Alf2016 Beitrag anzeigen
                    So, ich gehe mal davon aus, daß der TE keine Lust mehr hat oder einen anderen "Weg" gefunden hat oder im besten Fall mit seiner eigentlichen Aufgabe beschäftigt ist und liefere mal ab, was sich hier bei mir noch im "Arbeitsspeicher" befindet. Das wäre in dem Falle die ausführliche Lösung incl. Herleitung bzw. Heranführung soweit es um SQL geht. Wenn der TE doch lieber selbst die Lösung finden möchte, kann er dies hier ja ignorieren..
                    Ne der TE geht seiner Arbeit nach und kommt gerade aus dem Training. Jetzt hat er Zeit das alles zu lesen.
                    Lust ist sicher noch da. Aber erst die Struktur. Das nehme ich jetzt aus dem Thread mit.....

                    Kommentar


                    • #25
                      Zitat von Perry Staltic Beitrag anzeigen

                      Ok, also wenn "Am 2019-10-10 war nur Andreas im Training. Bei den anderen soll NULL stehen." das für Euch so klar eine solche Liste verlangt, in der pro Training jedes Mitglied aufgeführt ist, dann muss es cross join sein. Ich hatte es so verstanden, dass einfach jedes Mitglied und jedes Training erscheinen soll. Nach dem Motto "Karl gibt's auch, aber der war nie da".

                      Sinn macht die Fragestellung auch in der Form, solche Listen und Aushänge sind bei Kursen und Vereinen recht häufig zu sehen

                      Dann also mit cross join:
                      Code:
                      select *,
                      case
                      when training_id is null
                      then 'nicht anwesend'
                      else 'anwesend' end as generated_remark
                      from player p cross join trainings t
                      left join player_training pt
                      on (t.tid, p.pid) = (pt.training_id,pt.player_id)
                      order by <ReplaceWithWhatEverYouNeed>
                      Man vergleiche mit der Lösung aus #10. Ergebnis: Kein Unterschied - abgesehen von der nicht gerade sehr sauberen Codierung...

                      erc liefert m.E. die überzeugendsten Beiträge.

                      Kommentar


                      • #26
                        Zitat von kaptainIglo Beitrag anzeigen

                        Ne der TE geht seiner Arbeit nach und kommt gerade aus dem Training. Jetzt hat er Zeit das alles zu lesen.
                        Lust ist sicher noch da. Aber erst die Struktur. Das nehme ich jetzt aus dem Thread mit.....
                        Braver Junge, braver TE!

                        Kommentar


                        • #27
                          Zitat von kaminbausatz Beitrag anzeigen

                          Mit dem richtigen.
                          Welches dann wäre...?

                          Kommentar


                          • #28
                            Man sieht doch das es richtig ist. Wenn ich von einer Ergebnismenge eine andere Ergebnismenge wegnehme oder subtrahiere, dann bleibt halt nur was übrig?

                            Genau das macht EXCEPT.
                            Er holt erst alle Spieler und zieht dann die Spieler ab die beim Training anwesend waren. Übrig bleiben dann die Spieler die nicht teilgenommen haben.

                            Du kannst es auch selber ausprobieren und wenn du eine Fehler findest meldet du dich einfach wieder.
                            Mit Mysql geht das jedoch nicht!

                            Kommentar


                            • #29
                              Zitat von protestix Beitrag anzeigen
                              Man sieht doch das es richtig ist. Wenn ich von einer Ergebnismenge eine andere Ergebnismenge wegnehme oder subtrahiere, dann bleibt halt nur was übrig?

                              Genau das macht EXCEPT.
                              Er holt erst alle Spieler und zieht dann die Spieler ab die beim Training anwesend waren. Übrig bleiben dann die Spieler die nicht teilgenommen haben.

                              Du kannst es auch selber ausprobieren und wenn du eine Fehler findest meldet du dich einfach wieder.
                              Mit Mysql geht das jedoch nicht!
                              Wenn es richtig ist, ist es ja kein Problem, das Ergebnis zu posten. Solange er das nicht tut, sage ich: Das Ergebnis ist falsch und damit auch die Lösung. So einfach.

                              Kommentar


                              • #30
                                Du musst ihm beweisen das es falsch ist. so läuft das hier im Forum. Ansonsten könnte man - immer - jede Aussage anzweifeln, weil kein Beweis vorliegt im mathematischen Sinne.

                                Kommentar

                                Lädt...
                                X