mehrere Werte in einem mysql Feld

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    Last edited by AmicaNoctis; 25-11-2009, 05: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]

    Comment


    • #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!

      Comment


      • #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.

        Comment


        • #5
          Originally posted by onemorenerd View Post
          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.
          Last edited by AmicaNoctis; 25-11-2009, 05: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]

          Comment


          • #6
            Originally posted by Heiner View Post
            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]

            Comment


            • #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*
              Last edited by onemorenerd; 25-11-2009, 06:58.

              Comment


              • #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>'; 
                }

                Comment


                • #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/

                  Comment


                  • #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.
                    Last edited by TobiaZ; 28-11-2009, 15:45.

                    Comment

                    Working...
                    X