hab keinen wirklichen Ansatz

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

  • hab keinen wirklichen Ansatz

    Hallo Leute,

    ich weiß nicht so recht wie ich folgendes Problem lössen kann..
    Ich habe eine Seite wo alle Kurse aufgelistet sind, in dieser Liste habe ich auch ein Link gesetzt wo man sich alle User anschauen kann die die entsprechenden Kurse gebucht haben. Also angenommen kurs 2 Linkt für zu allen user die denn 2. kurs gebucht haben (schleife) usw.

    Die dazugehörige Tabelle besteht aus user_id und kurs_id!
    Das Problem ist das ich die kurs_id´s folgendermaßen in der Datenbank stehen 2,4,5,19.
    Und mein Problem ist jetzt wie komme ich an die richtigen user_id´s ran?!

    Mein Ansatz denn ich bis jetzt habe erzeuge ich eine Dauerschleife und außerdem komme ich mit diesen nicht weiter


    PHP-Code:
    $result     =     mysql_query("SELECT kurs_id FROM bestellung");

    while (
    $row mysql_fetch_assoc($result))
    {
        
    $array explode(",",$row['kurs_id']); 
        for(
    $i=0;$i<count($array);$x++)
            {
                  if (
    $array[$i] == $_GET['kurs_id'])
                  {
                      
    //keine Ahnung wie es weiter geht
                  
    }
            }

    Bin über jeden neuen Ansatz dankbar!

    MFG

    Roberto

  • #2
    Re: hab keinen wirklichen Ansatz

    Original geschrieben von BlackPerfect
    Das Problem ist das ich die kurs_id´s folgendermaßen in der Datenbank stehen 2,4,5,19.
    Und mein Problem ist jetzt wie komme ich an die richtigen user_id´s ran?!
    Du musst normalisieren.

    Kommentar


    • #3
      Die einzige richtige Antwort hat dir onemorenerd schon gegeben. Dann könntest du das Ganze auch mit einem Join und einer einzigen Abfrage erledigen.
      Wenn du aber aus irgendwelchen, mir unverständlichen, Gründen bei diesem verkorksten Design bleiben willst (oder musst), dann gibt es halt etwas Mehraufwand:
      PHP-Code:
      $sql "
          SELECT
              user_id,
              kurs_id
          FROM
              bestellung"
      ;
      $result mysql_query($sql) or exit("Fehler: " mysql_error() . "<br />Abfrage: $sql<br />");

      $user = array();
      while (
      $row mysql_fetch_assoc($result)){
          
      $array explode(","$row['kurs_id']); 
          if ((
      in_array($_GET['kurs_id'], $array)){
              
      $user[] = $row['user_id'];
          }
      }
      $sql "
          SELECT
              namen,
              ...
          FROM
              user
          WHERE
              user_id IN (" 
      implode(', '$user) . ")";
      $result mysql_query($sql) or exit("Fehler: " mysql_error() . "<br />Abfrage: $sql<br />");
      while (
      $row mysql_fetch_assoc($result)){
          
      // User auslisten

      Gruss
      H2O

      Kommentar


      • #4
        kurs:
        id ... auto_increment primary key
        name

        1 | PC-Grundkenntnisse
        2 | Word
        3 | Excel

        User
        id ... auto_increment primary key
        k_id
        name

        1 | 1 | Ralf
        2 | 1 | Holger
        3 | 2 | Gabi
        4 | 3 | Bernd
        Gruß
        Uzu

        private Homepage

        Kommentar


        • #5
          Wieso findet ihr das verkorkst ??
          Ich wollte erst jeden kurs in eine neue Spalte schreiben, aber dann wäre die Tabelle ja extrem lang geworden und die user_id wäre auch x-mal drin gewesen, denn wenn angneommen ein user 3 buchungen macht, dann steht ja 3 mal die user_id drin und halt die entsprechenden kurs_id´s und wenn ich die kus_id in die tabelle user verlege habe ich doch das selbe problem das ich wieder sowasdrin habe: 2,3,10....
          Oder, wie meint ihr das??

          Kommentar


          • #6
            Mit "extrem langen Tabellen", also vielen Datensätzen, kann ein DBS gut umgehen. Aber nicht mit Substringschnibbeleien und anderem Kram unterhalb der Attributebene.

            denn wenn angneommen ein user 3 buchungen macht, dann steht ja 3 mal die user_id drin
            Richtig. Aber so wie du es im Moment speicherst, ist es auch nicht besser. Wenn ein Kurs von 20 Benutzern gebucht wird, hast du die Kurs-ID 20 Mal in der User-Tabelle.
            Du siehst, um mehrfaches Speichern von IDs kommst du gar nicht herum.
            Ob du nun die User- oder Kurs-IDs mehrfach speicherst, ist völlig egal. Beides sollte int sein und frisst somit gleich viel Speicher.
            Abgesehen davon sind solche Überlegungen sinnlos. Erstens ist Speicher sehr billig, zweitens kann ein cleveres DBS bei der vorgeschlagenen Normalisierung (s.u.) die Buchungsdaten derart in einer Baumstruktur speichern, dass keine einzige ID doppelt vorkommt. (Das geht bei deinem Kommagedrösel nicht.)

            Nochmal zum Lösungsvorschlag: Du hast z.Z.
            user(userID:int, kursID:set)
            kurs(kursID:int)
            und solltest umbauen zu
            user(userID:int)
            kurs(kursID:int)
            buchung(userID:int, kursID:int).

            Kommentar


            • #7
              Du solltest zuerst vielleicht mal den Link anschauen, den dir onemorenerd geschickt hat, das lohnt sich.
              Natürlich darfst du es nicht so machen, wie dir UzumakiNaruto vorschlägt, denn dann hast du alle User x-fach redundant. Stell dir mal vor da sind neben dem Namen auch noch die Adresse und andere Daten in der User-Tabelle. Das ist natürlich auch nicht normalisiert.
              In dritter Normalform wäre es etwa so:
              Code:
              +-------------+          +----------------+          +-------------+
              | user        |          | user_kurs      |          | kurs        |
              +-------------+          +----------------+          +-------------+
              | user_id   PK|<------->>| user_id   FK/PK|          | kurs_id   PK|
              | name        |          | kurs_id   FK/PK|<<------->| bezeichnung |
              | ...         |          +----------------+          | ...         |
              +-------------+                                      +-------------+
              So hast du das sauber getrennt und die einzigen Redundanzen sind die Fremdschlüssel(FK). Für eine neue Kursanmeldung brauchst du nicht mehr nach irgenwelchen Strings zu suchen, diese zu ergänzen und dann wieder zurückzuschreiben, sondern du machst einfach einen neuen Eintrag in die Beziehungstabelle.

              EDIT:

              @onemorenerd
              Ok du warst schneller, aber wir sind uns wenigstens einig

              Zuletzt geändert von H2O; 10.06.2008, 10:10.
              Gruss
              H2O

              Kommentar


              • #8
                Original geschrieben von H2O
                Du solltest zuerst vielleicht mal den Link anschauen, den dir onemorenerd geschickt hat, das lohnt sich.
                Natürlich darfst du es nicht so machen, wie dir UzumakiNaruto vorschlägt, denn dann hast du alle User x-fach redundant. Stell dir mal vor da sind neben dem Namen auch noch die Adresse und andere Daten in der User-Tabelle. Das ist natürlich auch nicht normalisiert.
                In dritter Normalform wäre es etwa so:
                Code:
                +-------------+          +----------------+          +-------------+
                | user        |          | user_kurs      |          | kurs        |
                +-------------+          +----------------+          +-------------+
                | user_id   PK|<------->>| user_id   FK/PK|          | kurs_id   PK|
                | name        |          | kurs_id   FK/PK|<<------->| bezeichnung |
                | ...         |          +----------------+          | ...         |
                +-------------+                                      +-------------+
                So hast du das sauber getrennt und die einzigen Redundanzen sind die Fremdschlüssel(FK). Für eine neue Kursanmeldung brauchst du nicht mehr nach irgenwelchen Strings zu suchen, diese zu ergänzen und dann wieder zurückzuschreiben, sondern du machst einfach einen neuen Eintrag in die Beziehungstabelle.

                EDIT:

                @onemorenerd
                Ok du warst schneller, aber wir sind uns wenigstens einig

                stimme ich dir voll zu .. ich weiß auch nicht was mich da geritten hat.

                so wie du das hier vorgemacht hast .. so meinte ich das eigentlich auch
                Gruß
                Uzu

                private Homepage

                Kommentar


                • #9
                  Genau das wollte ich ja vermeiden das die Fremdschüssel redudant drin stehen, denn so habe ich es ja also von der Struktur her! Weil ich dachte es ist doch blödsinn wenn ein user 10 kurse bucht, dann 10 mal die user_id reinzuschreiben mit den dazugehörigen Kursen.
                  Und so hab ich halt einmal die user_id und einmal alle kurs_id´s stehen getrennt mit einen Komma drin.
                  Aber wenn ihr sagt es ist anders besser, dann werde ich das mal abändern!

                  Und danke für eure Hilfe!!!

                  Kommentar


                  • #10
                    für sowas wurden datenbanken konzipiert .. da hatte auch damals sich jemand gedanken drüber gemacht und die normalisierung eingeführt ;-)

                    in der 3. normalform ist eine datenbank eigentlich erst ricgtig benutztbar .. ohne das man in seinem eigenen script die anomalien prüfen muss.

                    die dritte tabelle ist sozusagen eine hilfstabelle ;-)
                    was meinst du wie das forum hier gestrickt ist?

                    es gibt eine user tabelle .. und denkst du dort gibt es ein feld in dem alle post-ids drinen stehen? viel spass bei den mdos hier die mehrere tausend posts hier drinne haben ;-)
                    Gruß
                    Uzu

                    private Homepage

                    Kommentar


                    • #11
                      Original geschrieben von BlackPerfect
                      Genau das wollte ich ja vermeiden das die Fremdschüssel redudant drin stehen, denn so habe ich es ja also von der Struktur her!
                      Es wäre erst redundant, wenn die Gesamtheit der Information mehrfach vorkommt - sprich, wenn du an mehreren Stellen speichern würdest, wer in welchen Kursen ist. Nur weil ein Feld häufiger den selben Inhalt hat, bedeutet das noch lange keine Datenredundanz. Im übrigen würdest du den Primärschlüssel bei der Verknüpfungstabelle ohnehin auf beide Felder (Kurs und Benutzer) legen, da die Tabelle sonst gar nicht ordentlich angelegt werden könnte.

                      Löblich ist aber der Versuch, dir wenigstens Gedanken darüber gemacht zu haben

                      Edit: Oh, ich sehe, H2O hat schon erklärt, wie die Schlüssel gesetzt werden.
                      [FONT="Helvetica"]twitter.com/unset[/FONT]

                      Shitstorm Podcast – Wöchentliches Auskotzen

                      Kommentar

                      Lädt...
                      X