Ankündigung

Einklappen
Keine Ankündigung bisher.

Zuordnungstabelle abfragen

Einklappen

Neue Werbung 2019

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

  • Zuordnungstabelle abfragen

    Hallo zusammen,
    folgendes Problem bzw. die Abfrage machen mir Schwierigkeiten:

    ich habe eine Datenbank "schüler" mit schüler ID, Vor- und Nachnamen.
    dann gibt es noch eine Datenbank "Kurs" mit Kurs ID und Kurs_Name.
    und als zuordnungstabelle gibt es die Datenbank: Schüler_Kurs

    Ein Schüler kann ich mehreren Kursen eingeschrieben sein.
    z.B.
    schülerID KursID
    1 100
    1 101
    2 100
    3 100
    3 101
    und nun mein problem: Ich suche alle schülerIDs die in den Kursen mit der ID 100 und 101 sind. Es können aber natürlich auch noch mehr Kurse sein. Eine feste Anzahl gibt es nicht.
    Ich verlange keine fertige SQL-Abfrage-Code. Nur Hinweise. Brauche ich hier HAVING und GROUP ?

    danke


  • #2
    Nein brauchst du nicht unbedingt. Die N:M Tabelle kannst du direkt abfragen mit SELECT DISTINCT.
    Und du hast hoffentlich nicht 3 Datenbanken sondern 3 Tabellen in einer Datenbank.
    Eine Mannschaft aus Granit! So wie einst Real Madrid!
    Und so zogen wir in die Bundesliga ein und wir werden wieder Deutscher Meister sein!

    Kommentar


    • #3
      blöde Frage: das hier funktioniert nicht?
      SELECT schülerID FROM schülerID_KursID WHERE KursID='100' and KursID='101'


      DISTINCT zeigt mir ja nur unterschiedliche Werte an ..






      Kommentar


      • #4
        hallo und schön, daß Du zu uns gefunden hast.
        Zitat von julian87 Beitrag anzeigen
        das hier funktioniert nicht?
        Code:
        SELECT schülerID FROM schülerID_KursID WHERE KursID='100' and KursID='101'
        Doch tut es:

        https://dev.mysql.com/doc/refman/8.0...l#operator_and

        aber "funktioniert" ist keine brauchbarwe beschreibung, auch nicht mit einem nicht davor
        welches ergebniss hast du erwartet, welches ergebnis wird geliefert ?

        Kommentar


        • #5
          Wie gesagt, es funktioniert, bringt aber kein brauchbares Ergebnis, weil KursID unmöglich 100 und gleichzeitig 101 sein kann...

          Die KursID kann 100 oder 101 sein.

          Kommentar


          • #6
            Hab ich Halus oder war da grad noch ein anderer Beitrag vom TE?

            Also, eine klare Anfordernug / Fragestellung ist hilfreich. Wenn Du die Ergebnisse benötigst, wo Schüler immer in beiden Kursen sind, brauchst Du wie schon von Dir selbst angesprochen ein Grpup Having Count
            Der "Trick" ist einfach, dass der Count der Anzahl der Filterwerte aus Where entsprechen muss. Damit hat man dann eine "vertikales AND", datensatzübergreifend.

            Kommentar


            • #7
              Zitat von julian87 Beitrag anzeigen
              blöde Frage: das hier funktioniert nicht?
              SELECT schülerID FROM schülerID_KursID WHERE KursID='100' and KursID='101'


              DISTINCT zeigt mir ja nur unterschiedliche Werte an ..





              Das Distinct ist nur dazu da, daß Schüler nicht dreimal im Abfrageergebnia auftauchen, wenn sie drei Kurse besuchen. Ich würde allerdings auch wissen wollen, in welchen Kursen die betr. eingeschrieben sind und deshalb die Spalte auch noch ins Abfrage-Ergebnis übernehmen und das Distinct weglassen. Außerdem würde ich die beiden Mastertabellen für Schüler und Kurse verjoinen um auch Nachname, Vorname usw. zu erhalten.

              Andere Varianten mit GROUP BY GROUP_CONCAT sind davon abhängig, das man sie testen kann. Ungetestet schlage ich dir sowas nicht vor. Dazu bräuchte ich dann aber einen DB-Dump. Gewöhne dir bitte an, bei DB-Fragen - und seien sie auch noch so "einfach" - IMMER einen DB-Dump mit anonymisierten, fallspezifischen Test-Daten zu posten!!!

              Dann gibt es noch ein paar Kleinigkeiten: Keine Umlaute in Objektbezeichnern (z.B. schuelerID, nicht schülerID), einheitliche Schreibweise groß/klein, Tabellennamen nicht z.B. "KursID_SchuelerID", sondern KursSchueler, Kurs_Schueler, oder noch besser, weil konkreter: "Kursbelegung" oder "Kursteilnahme", wenn Schüler sich bei nicht-Teilnahme wieder austragen müssen.

              Übrigens: was du als DB bezeichnest, sind Tabellen, DB ist das Ganze, soz. "Sammlung von (zusammenhängenden) Tabellen".

              Kommentar


              • #8
                Mal alles Geschriebene zusammengefasst ergebe dann folgende Abfrage

                PHP-Code:
                SELECT schuelerIDCOUNT(schuelerID) as Anzahl
                FROM kurs_je_schueler
                WHERE KursID
                =100 OR KursID=101
                Group By schuelerID
                Having Anzahl
                =

                Kommentar


                • #9
                  ... kurz und schmerzlos

                  Kommentar


                  • #10
                    Als Ergänzung noch eine kleine Frage, um Dich auf eine Problematik von RDBMS aufmerksam zu machen, diese Abfrage wäre vielleicht betroffen.

                    Was geschieht, wenn ein Schüler sich 2x im Kurs anmeldet?

                    Kommentar


                    • #11
                      Zitat von protestix Beitrag anzeigen
                      Mal alles Geschriebene zusammengefasst ergebe dann folgende Abfrage

                      PHP-Code:
                      SELECT schuelerIDCOUNT(schuelerID) as Anzahl
                      FROM kurs_je_schueler
                      WHERE KursID
                      =100 OR KursID=101
                      Group By schuelerID
                      Having Anzahl
                      =
                      Hatte der TE das tatsächlich so gemeint, daß nur die angezeigt werden, die sowohl in Kurs 100 als auch in Kurs 101 sind? Er schrieb
                      Ich suche alle schülerIDs die in den Kursen mit der ID 100 und 101 sind.

                      Kommentar


                      • #12
                        Zitat von Perry Staltic Beitrag anzeigen
                        Als Ergänzung noch eine kleine Frage, um Dich auf eine Problematik von RDBMS aufmerksam zu machen, diese Abfrage wäre vielleicht betroffen.

                        Was geschieht, wenn ein Schüler sich 2x im Kurs anmeldet?
                        Eine Problematik des RDBMS ist das nicht. Normalerweise ist eine vernünftige Anwendung für die Anmeldung im Kurs so geschrieben, daß solch eine "Doppelmeldung" nicht möglich ist. Zusätzlich könnte man KursID und SchuelerID als zusammengesetzten Index mit unique definieren, dann würde die DB das "automatisch" abweisen. Ein RDBMS macht das, worum man es bittet, und das macht es zuverlässig. Dem User (= Entwickler) die Wünsche nach dem "Ich-kaufe-Edeka"-Prinzip von den Augen abzulesen, ist keine eingebaute Eigenschaft...

                        Kommentar


                        • #13
                          marie123
                          Siehe Beitrag #3.

                          Kommentar


                          • #14
                            Zitat von protestix Beitrag anzeigen
                            marie123
                            Siehe Beitrag #3.
                            M.a.W.: Eine unklare Formulierung wird durch fehlerhaften Code erklärt?!?

                            Kommentar


                            • #15
                              Worauf willst du hinaus?
                              Willst du nur klönen oder dich profilieren, oder hast du etwas nicht verstanden?

                              Kommentar

                              Lädt...
                              X