Ankündigung

Einklappen
Keine Ankündigung bisher.

Zuordnungstabelle abfragen

Einklappen

Neue Werbung 2019

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

  • #31
    Zitat von erc Beitrag anzeigen



    Angenommen das ist ein valider Zustand, dann lässt sich das mit "COUNT(DISTINCT kurs_je_schueler.krus_id) AS Anzahl" statt "COUNT(schuelerID) as Anzahl" abbilden.
    Ein valider Zustand kann und darf es nicht sein, habe ich oben begründet, kurz: Wenn es sich um eine vernünftige Anwendung zur Kursanmeldung handelt, muß bei der Prüfung der eingegebenen Daten gecheckt werden, ob der Schüler sich schonmal im betr. Kurs angemeldet hat. Im Gegenteiligen Fall ist das was du schreibst, aus meiner Sicht (ungetestet) die korrekte Lösung.



    Wortwörtlich steht da aber genau das.
    Eben nicht. Wortwörtlich steht dort:
    Ich suche alle schülerIDs die in den Kursen mit der ID 100 und 101 sind.
    Das Schlüsselwort "gleichzeitig" fehlt dort, und das ist der springende Punkt und damit ist es eben nicht vergleichbar mit dem Folgenden:
    Nimm ein anderes Beispiel, z.B.: "Gibt mir alle Rezepte mit Hähnchen und Reis". Das liest du sicherlicht nicht als "oder".
    Begründet hat es Meister1900:

    Zitat von Meister1900 Beitrag anzeigen
    Ja bei Zutaten erc und bei Ausstattungsmerkmalen kaminbausatz ist das auch für mein Gehirn eindeutig. Bei Schülern in Kursen für mich nicht.
    Anderes Beispiel "Alle Schüler aus Informatik-LK und Mathe-LK fahren auf Klassenfahrt." Fühlst du dich angesprochen, wenn du nur in Informatik bist?
    Dem muß man m.E. nichts hinzufügen.

    Kommentar


    • #32
      Wir hatten uns doch alle darauf geeinigt den TE julian87 als erstes wieder zu Wort Kommen zu lassen....
      Und, so muss ich sagen, leider werden folgende Sätze scheinbar immer wieder überlesen:
      Zitat von julian87 Beitrag anzeigen
      Ich verlange keine fertige SQL-Abfrage-Code.
      (..)
      Nur Hinweise.
      (..)
      Es können aber natürlich auch noch mehr Kurse sein. Eine feste Anzahl gibt es nicht.

      Kommentar


      • #33
        Zitat von tomBuilder Beitrag anzeigen
        Wir hatten uns doch alle darauf geeinigt den TE julian87 als erstes wieder zu Wort Kommen zu lassen....
        Der TE ist raus, aber es ist zu unterstellen, daß auch andere am Thema interessiert sind.
        Die Problematik die hier angesprochen ist, ist die andere Verwendung und Interpretation der Wörter "und" und "oder" in der lebenden Sprache im Gegensatz zu Programmier- und anderen IT-spezifischen Sprachen, die wie die mathematische Sprache (die das und und oder ebenfalls in spezischer Art und Weise verwendet und für die IT-Interpretation maßgeblich ist) formalisierte, "künstliche" Sprachen sind. Dabei ist nicht das Problem, daß da etwas "unbewußt" (wie erc in #2 mutmaßt) abläuft. Das ist schon im Wesentlichen bewußt, aber es ist nicht reflektiert, was auch nicht notwendig ist. In einer lebenden Sprache wird das nämlich durch den Kontext bestimmt, der ist bei der Interpretation von erc und kaminbausatz ein anderer als bei Meister1900. Das ist das ganze Geheimnis. Mit lebender Sprache, zu der auch die Wissenschaftssprache gehört, müssen wir beim "und" ggfs. das Wort "gleichzeitig" hinzufügen.
        Für das folgende unterstelle ich, daß Gleichzeitigkeit gefordert wird, also erstere obiger Interpretationen. Nun gibt es aber eine Problematik: Es gibt zwei Fälle
        1. Die Sachverhalte, die gleichzeitig zutreffen sollen, finden sich in der DB-Tabelle in verschiedenen Spalten wieder: Dann ist Gleichzeitigkeit innerhalb eines jeden Datensatzes gefordert und AND ist der korrekte Operator.
        2. Die betr. Sachverhalte finden sich in der gleichen Spalte und damit zwangsläufig in einer Gruppe von Datensätzen = Teilmenge der Ergebnismenge (es sei denn, die Tabelle verstößt gegen die 1. Normalform), Perry Staltic hat dafür den hübschen Ausdruck "vertikales AND" erfunden (#6), nicht schlecht!
        Im ersten Fall ist alles easy, wir verwenden den Operator AND und gut is'. Im 2. Fall kann der gefragte Sachverhalt ausschließlich in Datensatzgruppen eintreten, wenn die "Normalisierungsforderung" erfüllt sein soll. Deshalb ist in jedweder Lösung erforderlich:
        • Group by
        • der Operator OR
        • Count um die Erfüllung der Forderung, daß "vertikales AND" vorliege, zu prüfen.

        Kommentar


        • #34
          Das Thema ist doch längst durch, was jetzt noch folgt ist doch nur Gesabbel und psychische Probleme.

          Ich empfehle die Schliessung des Threads.

          Kommentar


          • #35
            Zitat von marie123 Beitrag anzeigen
            Der TE ist raus
            ???
            (...)

            Zitat von protestix Beitrag anzeigen
            Das Thema ist doch längst durch, was jetzt noch folgt ist doch nur Gesabbel und psychische Probleme.

            Ich empfehle die Schliessung des Threads.
            In meinen Augen hat bisher keiner die Fragestellung vollständig verstanden, aber gut.

            Der Idee das Thema zuzumachen ist sicher nicht schlecht, wenn auch ein Armuntszeugnis für dieses Forum, welches mir so in all den Jahren nicht vorgekommen ist.

            So sehr wie jetzt habe ich die Stimme des Meisters wohl noch nie vermisst

            Kommentar


            • #36
              Zitat von marie123 Beitrag anzeigen
              Im 2. Fall kann der gefragte Sachverhalt ausschließlich in Datensatzgruppen eintreten, wenn die "Normalisierungsforderung" erfüllt sein soll. Deshalb ist in jedweder Lösung erforderlich:
              • Group by
              • der Operator OR
              • Count um die Erfüllung der Forderung, daß "vertikales AND" vorliege, zu prüfen.
              Das ist nicht richtig.
              Ich hatte in #29 gezeigt, wie es ohne dem von dir genannten geht. Man kann auch einfach 2 Joins verwenden:

              Code:
              SELECT DISTINCT k1.schuelerID
              FROM kurs_je_schueler k1
              JOIN kurs_je_schueler k2 ON k2.KursID = 100 AND k2.schuelerID = k1.schuelerID
              JOIN kurs_je_schueler k3 ON k3.KursID = 101 AND k3.schuelerID = k1.schuelerID
              Oder einen:

              Code:
              SELECT DISTINCT k1.schuelerID
              FROM kurs_je_schueler k1
              JOIN kurs_je_schueler k2 ON k2.KursID = 100 AND k2.schuelerID = k1.schuelerID
              WHERE k1.KursID = 101
              sorry, shift-taste kaputt

              Kommentar


              • #37
                Zitat von Meister1900 Beitrag anzeigen

                Das ist nicht richtig.
                Ich hatte in #29 gezeigt, wie es ohne dem von dir genannten geht. Man kann auch einfach 2 Joins verwenden:

                Code:
                SELECT DISTINCT k1.schuelerID
                FROM kurs_je_schueler k1
                JOIN kurs_je_schueler k2 ON k2.KursID = 100 AND k2.schuelerID = k1.schuelerID
                JOIN kurs_je_schueler k3 ON k3.KursID = 101 AND k3.schuelerID = k1.schuelerID
                Oder einen:

                Code:
                SELECT DISTINCT k1.schuelerID
                FROM kurs_je_schueler k1
                JOIN kurs_je_schueler k2 ON k2.KursID = 100 AND k2.schuelerID = k1.schuelerID
                WHERE k1.KursID = 101
                Stimmt, so geht es auch. Genial gemacht, muß die der Neid lassen

                Mir kam es zunächst einmal darauf an, zu zeigen, wie der Sachverhalt der Gleichzeitigkeit abgebildet werden kann, wenn ein einfaches AND ganz offensichtlich in die Sackgasse führen muß, wie kaminbausatz bereits in #5 feststellte. Ich finde, man kann den Begriff des "vertikalen AND" von Perry Staltic hier als "Arbeitsbegriff" trotzdem beibehalten, denn der Fakt, daß die Datensätze, die letztlich in die Ergebnismenge eingehen, untereinander stehen ist ja jedenfalls gegeben. Ich denke, das ist das, was weniger erfahrenen Entwicklern klar sein sollte, daß ein "einfaches" AND nicht geht.

                Deine Lösung mit dem Self-Join berücksichtigt die "Vertikale" ja insofern als er im Prinzip zwei Abfragen verjoint, die für den jeweiligen Schüler nur einen Datensatz (oder, falls Mehrfachanmeldung möglich, mehrere identische DS) selektieren.

                Habe deine Lösungen jetzt noch nicht getestet, es müssten aber beide gehen - die 2. ist natürlich vorzuziehen, warum hast du die 1. eigentlich stehen gelassen?

                Kommentar

                Lädt...
                X