Ankündigung

Einklappen
Keine Ankündigung bisher.

Schüler Kurs Problem

Einklappen

Neue Werbung 2019

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

  • Schüler Kurs Problem

    Hallo,
    einfaches Problem aber von alleine komme ich nicht drauf.
    Es gibt eine Schüler Datenbank:

    Eine Kurs Datenbank:


    und die Zuordnungstabelle: schueler_ID_kurs_ID
    Dort wird geschrieben welche schueler_ID in welchem Kurs ist.

    Jetzt kommt die einfacher Frage: Zeige mir alle schueler_ID die in den Kursen kurs_ID = 1 und kurs_ID=3 sind. Beide bedingungen müssen erfüllt sein.
    mit
    SELECT schueler_ID FROM `schueler_kurs` WHERE kurs_ID=1 AND kurs_ID=3
    geht es nicht. Was übersehe ich?
    danke

  • #2
    die in den Kursen kurs_ID = 1 und kurs_ID=3 sind. Beide bedingungen müssen erfüllt sein.
    Du meinst vermutlich -> kurs_ID=1 ODER kurs_ID=2 ist.
    [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

    Kommentar


    • #3
      Siehe da: https://www.php.de/forum/webentwickl...belle-abfragen

      Inklusive Diskussion was nun "Beide bedingungen müssen erfüllt sein." heißen soll. Wahrscheinlich in dem Fall nicht "oder"...

      *edit* Thread ist etwas länger, mögliche Lösungen findest du in Post #36

      Kommentar


      • #4
        Zitat von lottikarotti Beitrag anzeigen
        Du meinst vermutlich -> kurs_ID=1 ODER kurs_ID=2 ist.

        Nein, er schrieb, es sollen BEIDE bedingungen erfüllt sein.

        jmaier kurs_id = 1 AND kurs_id = 3 KANN NIEMALS erfüllt sein, weil 1=3 NIE erfüllt ist. Du suchst sowas wie:

        Code:
        test=# create table schueler(id serial primary key, name text);
        CREATE TABLE
        test=*# create table fach(id serial primary key, name text);
        CREATE TABLE
        test=*# create table schueler_fach(schueler int references schueler, fach int references fach);
        CREATE TABLE
        test=*# copy schueler from stdin;
        Enter data to be copied followed by a newline.
        End with a backslash and a period on a line by itself, or an EOF signal.
        >> \.
        COPY 0
        test=*# copy schueler (name) from stdin;
        Enter data to be copied followed by a newline.
        End with a backslash and a period on a line by itself, or an EOF signal.
        >> Max
        >> Rudi
        >> Susi
        >> Lisa
        >> \.
        COPY 4
        test=*# copy fach(name) from stdin;
        Enter data to be copied followed by a newline.
        End with a backslash and a period on a line by itself, or an EOF signal.
        >> Mathe
        >> Deutsch
        >> Bio
        >> Geo
        >> \.
        COPY 4
        test=*# copy schueler_fach from stdin;
        Enter data to be copied followed by a newline.
        End with a backslash and a period on a line by itself, or an EOF signal.
        >> 1    1
        >> 1    2
        >> 1    4
        >> 2    1
        >> 2    3
        >> 2    4
        >> 3    1
        >> 3    2
        >> 3    4
        >> 4    1
        >> 4    3
        >> 4    4
        >> \.
        COPY 12
        test=*# select schueler, array_agg(fach) from schueler_fach group by schueler having array_agg(fach) @> array[1,3];
         schueler | array_agg
        ----------+-----------
                4 | {1,3,4}
                2 | {1,3,4}
        (2 rows)
        Und ich: select Kaffee;
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Zitat von akretschmer Beitrag anzeigen
          Und ich: select Kaffee;
          Das mach ich jetzt auch mal lieber ☕
          [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

          Kommentar


          • #6
            Bei 2 Kursen ist das Problem noch mit einen simplen JOIN realisierbar:

            Code:
            SELECT t1.schueler_id 
            FROM schueler_kurs as t1 
            INNER JOIN schueler_kurs as t2 ON t1.schueler_id = t2.schueler_id
            WHERE t1.kurs_id = 1 AND t2.kurs_id = 3

            Kommentar


            • #7
              Verwendung von HAVING
              Code:
              SELECT `schueler_ID`, count( `KursID` ) AS Anzahl
              FROM `schueler_kurs`
              WHERE `kurs_ID`=1 OR `kurs_ID`=3
              GROUP BY `schueler_ID`
              HAVING Anzahl = 2
              http://sql.lernenhoch2.de/lernen/sql...ittene/having/

              Kommentar


              • #8
                Der Ansatz #7 gefällt mir besser als meiner da bei Verwendung von IN in der WHERE-Bedingung das auf eine beliebige Liste von Kursnummern erweitert werden kann.
                Hier das nochmal in etwas anderer Form:

                Code:
                SELECT `schueler_ID` 
                FROM `schueler_kurs`
                WHERE `kurs_ID` IN(1,3)
                GROUP BY `schueler_ID`
                HAVING count( `kurs_ID` ) = 2

                Kommentar


                • #9
                  danke vorerst.

                  wenn es nicht bei 2 kursen bleibt sondern ca 15 ist IN aufjedenfall kürzer.
                  warum having count = 2 ? weil nach 2 bedingungen gesucht wird?

                  wenn ich die abfrage in einer userform übertrage. der user kann selber auswählen nach wieviel kursen er suchen will. dann muss ich die anzahl für having count neu ermitteln?




                  Kommentar


                  • #10
                    Ja.
                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar

                    Lädt...
                    X