mehrere Werte in einem mysql Feld

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

  • mehrere Werte in einem mysql Feld

    Hallo,
    in einem CMS sind die Gruppen denen der User angehört kommasepariert
    in einem Feld (groups_id) als Zahlen abgelegt.
    In einer 2. Tabelle ist abgelegt, wie die Gruppen heißen, 2=Gruppe2 etc.
    (group_id, name)


    Bei dieser Abfrage:
    Code:
    $query = ("SELECT * FROM `" . TABLE_PREFIX . "user_extend` e JOIN `" . TABLE_PREFIX . "users` u 
    ON e.user_id=u.user_id JOIN `" . TABLE_PREFIX ."groups` g ON g.group_id=u.groups_id  order by u.display_name");
    $results = $database->query($query);
    
    while ($row = $results->fetchRow()) {
    
    $ausgabe .= '<td> ' . $row['username'] . '</td>';
    $ausgabe .= '<td>' . $row['groups_id']. '</td>';
    }
    return $ausgabe;
    erhalte ich als Ausgabe:

    Name: User1, Gruppe: 2,5,6

    Ändere ich die Abfrage :
    Code:
    $ausgabe .= '<td>' . $row['groups_id']. '</td>';
    in
    Code:
    $ausgabe .= '<td>' . $row['name']. '</td>';
    erhalte ich als Ausgabe:

    Name: User1, Gruppe: Gruppe2

    Der Name der Gruppe 5 und 6 ist abgeschnitten, da nur
    der 1. Wert der Feldes ausgegeben wird.

    Hat jemand einen Lösungsansatz?

    Vielen Dank.

  • #2
    Hallo Heiner,

    da kommst du leider nicht drumherum, mit PHP das Feld groups_id zu exploden und dann aus der Gruppentabelle die Namen einzeln abzufragen.

    Mit einer DB, die nicht einmal in der 1. Normalform ist, kann man halt keine vernünftigen Abfragen machen. Ich frage mich, was das für ein CMS sein soll.

    Edit: Es gibt zwar noch einen anderen Weg, aber der ist so dreckig, dass ich mir nach dem Tippen gleich erstmal die Hände abschmirgeln muss:
    Code:
    on concat(',', u.groups_id, ',') like concat('%,', g.group_id, ',%')
    Gruß,

    Amica
    Zuletzt geändert von AmicaNoctis; 25.11.2009, 06:42.
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Bist du sicher, dass $row['name'] nicht der Username ist?

      Das Abschneiden findet so nicht statt. Die JOIN-Klausel g.group_id = u.groups_id wird entweder erfüllt oder nicht. Wenn ich u.groups_id "2,5,6" steht und in g.group_id nur 2, dann wird nicht gejoint.
      Stell dir mal vor, MySQL würde sich wirklich die Werte so zurecht schnippel, dass jede JOIN-Bedingung erfüllt wird!

      Kommentar


      • #4
        Hallo,
        danke für die Anregungen.
        Ist das CMS Websitebaker.

        Kurzen Tipp zum exploden?

        Habe das schon versucht mit split und dann for each,
        habe aber keine Ausgabe bekommen.

        Kommentar


        • #5
          Zitat von onemorenerd Beitrag anzeigen
          Das Abschneiden findet so nicht statt.
          Oh doch. Ist wirklich so. In MySQL ist 2 = '2Tomaten' wahr. Bei Vergleichen mit nur einem numerischen Argument wird das andere auf numerisch gecastet und ab dem ersten ungültigen Zeichen abgeschnitten.
          Zuletzt geändert von AmicaNoctis; 25.11.2009, 06:56.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Zitat von Heiner Beitrag anzeigen
            Kurzen Tipp zum exploden?
            PHP-Code:
            $groups = ... // komplette Gruppentabelle aus DB
                          // mit group_id als Key
            $groupIds explode(","$row["groups_id"]);
            foreach (
            $groupIds as $gid) {
                
            // mach was mit $groups[$gid]

            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Stimmt. Guten Morgen allerseits.

              Das hat sich irgendwann mal falsch in mein Hirn gebrannt. Seit dem behaupte ich das und werde immer wieder eines besseren belehrt. Ich habe sogar irgendwo den Auszug aus ANSI-SQL.92 gespeichert ...

              ... hab ihn gefunden. *abschreib*
              Zuletzt geändert von onemorenerd; 25.11.2009, 07:58.

              Kommentar


              • #8
                Danke für die Tipps, da reichen meine Kenntnisse nicht mehr aus.
                Bekomme keine Ausgabe oder bei verschiedenen Versuchen
                nur Buchstaben.

                habe das noch eingefügt:
                Code:
                $query3 = ("SELECT * FROM `" . TABLE_PREFIX . "groups` ");
                
                und dann [b]in[/b] die Schleife:
                
                $groups = mysql_fetch_array($query3);
                $groupIds = explode(',', $row['groups_id']);
                              foreach ($groupIds as $gid) {
                                  $row['groups_id'] = $groups['gid'];
                                 }
                
                und die Ausgabe:
                
                $ausgabe .= '<td>' . $row['groups_id']. '</td>'; 
                }

                Kommentar


                • #9
                  wie wäre es mit einer neuen tabellen struktur

                  mit einer neuen - besseren tabellenstruktur könntest du auch bessere und einfachere abfragen stellen.
                  fotos :

                  http://www.flickr.com/photos/rassloff/collections/

                  Kommentar


                  • #10
                    PHP-Code:
                    $query3 = ("SELECT * FROM `" TABLE_PREFIX "groups` ");

                    #und dann in die Schleife:

                    $groups mysql_fetch_array($query3); 
                    Das ist ja schon ziemlicher unfug und sollte dir einen entsprechenden Fehler bringen!


                    Benutz doch bitte die -Tags. Dann kann man deinen Code besser lesen.
                    Zuletzt geändert von TobiaZ; 28.11.2009, 16:45.

                    Kommentar

                    Lädt...
                    X