Ankündigung

Einklappen
Keine Ankündigung bisher.

spalte mit kommagetrennten werten

Einklappen

Neue Werbung 2019

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

  • spalte mit kommagetrennten werten

    hallo comm,

    gibt es eine möglichkeit mit einem Mysql-befehl aus folgender spalte

    3,2,5,6
    3,4
    23,45,67
    1
    2
    4
    9,3

    folgende ausgabe zu erhalten:

    1
    2
    3
    4
    5
    6
    9
    23
    45
    67

    ? danke!

    gruß, scraddy

  • #2
    Du meinst um deinem schlampigen Datenbank-Design auch noch hinterherzuprogrammieren? Mach das doch gleich vernünftig mit Normalisierung (Suchmaschine benutzen).

    Andernfalls gibt es String-Funktionen auch in MySQL, wie du die doppelten Werte mit MySQL rausbekommst, weiß ich aber nicht. Prozeduren. Aber wenn du die einzusetzen weißt, bist du auch erfahren genug, nicht so ein Datenbank-Design zu verwenden.

    In PHP helfen dir bestimmt explode(), array_flatten() [keine implementierte PHP-Funktion], array_unique() und sort().

    Kommentar


    • #3
      du hast recht, das ist in der tat ein sau dreckiges datenbank-design. danke für den tipp mit der normalisierung. das kannte ich bisher nicht. habe mal wieder was dazu gelernt und werde die tabellen dementsprechend umbauen.

      Kommentar


      • #4
        Zitat von scraddy
        du hast recht, das ist in der tat ein sau dreckiges datenbank-design. danke für den tipp mit der normalisierung. das kannte ich bisher nicht. habe mal wieder was dazu gelernt und werde die tabellen dementsprechend umbauen.
        Mit soviel Einsicht hatte ich garnicht gerechnet
        Normalisierung ist wirklich elementar:
        http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
        (Link kaputt, bitte manuell kopieren)

        Kommentar


        • #5
          ja, man muss schließlich einen guten rat annehmen, wenn man einsieht, dass man es schlecht gemacht hat. aber daraus kann man eben nur lernen.

          bei der normalisierung soll man ja anstatt die werte mit komma in eine zelle zu schreiben drei zeilen generieren, die dieselbe id haben und unterschiedliche werte für die betroffene spalte.

          also quasi:
          soll aus

          1 | 1,2,3

          1 | 1
          1 | 2
          1 | 3

          werden.

          dafür könnte ich ja dann eigentlich ein INSERT INTO in eine for-schleife stecken und immer nur den einen wert ändern lassen, also so:

          PHP-Code:
          for($i 0$i count($_POST['irgendwas']); $i++)
          {
                    
          $temp $_POST['irgendwas'][$i];
                    
          mysql_query("INSERT INTO test (id, kat) VALUES ('$_POST[id]', '$temp')");

          kann das überhaupt funktionieren? bei mir speichert er nur den ersten wert aus dem POST[irgendwas]-array

          Kommentar


          • #6
            Zitat von scraddy
            bei der normalisierung soll man ja anstatt die werte mit komma in eine zelle zu schreiben drei zeilen generieren, die dieselbe id haben und unterschiedliche werte für die betroffene spalte.
            Ja das ist richtig, du erstellst eine Extra-Tabelle mit einer Spalte, die auf den Eintrag der Tabelle verweist und eine Spalte für den eigentlichen ausgelagerten Wert.
            Als Primärschlüssel solltest du beide Spalten kombiniert verwenden. Das erspart dir 1.) eine zusätzliche Primärschlüssel-Auto-Increment-Spalte und garantiert dir 2.) dass du garnicht erst die Möglichkeit hast, identische Datensätze einzutragen. Wenn du dies vorhast, wäre wohl eine zusätzliche "amount"-Spalte sinnvoller.

            also quasi:
            soll aus

            1 | 1,2,3

            1 | 1
            1 | 2
            1 | 3

            werden.
            Richtig.

            dafür könnte ich ja dann eigentlich ein INSERT INTO in eine for-schleife stecken und immer nur den einen wert ändern lassen, also so:

            PHP-Code:
            for($i 0$i count($_POST['irgendwas']); $i++)
            {
                      
            $temp $_POST['irgendwas'][$i];
                      
            mysql_query("INSERT INTO test (id, kat) VALUES ('$_POST[id]', '$temp')");

            kann das überhaupt funktionieren? bei mir speichert er nur den ersten wert aus dem POST[irgendwas]-array
            Das kann und sollte funktionieren. Lass dir den SQL-Query doch mal ausgeben, dann siehst du was darin steht. Außerdem könnte es ja auch sein, dass die Schleife nur einmal ausgeführt wird.

            Ich empfehle dir aber, das ganze in einem Query zu lösen:
            http://dev.mysql.com/doc/refman/5.0/en/insert.html
            INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
            [INTO] tbl_name [(col_name,...)]
            VALUES ({expr | DEFAULT},...),(...),...
            [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
            Das heißt:
            Code:
            INSERT INTO (id, kat) VALUES ('id-1', 'kat-1'), ('id-2', 'kat-2'), (..), ..
            Ein (langer) Query ist erheblich schneller als mehrere (kurze) Queries. Aber das ist jetzt nur reine Performance.

            Kommentar


            • #7
              ah, cool, dann werde ich das wohl in einem langen query machen, wenn das besser ist! wenn schon jetzt dann auch richtig. den query setzt man dann einfach in der schleife als string zusammen und dann den ausführen ..

              ja, das problem war dass eine spalte als primärschlüssel eingestellt war. jetzt habe ich beides als primärschlüssel, danke!!!! wieder was gelernt!

              muss / sollte man eigentlich indizes setzen? und wenn ja nach welchen kriterien?! .. die sollen eine abfrage ja schneller machen .. ?! naja, da kennt tante google ja auch genug erklärungen ..

              Kommentar


              • #8
                Primärschlüssel sind automatisch indiziert.
                Einen Index solltest du für die Spalten anlegen, die MySQL zum Suchen benötigt, zB die häufig in WHERE-Klauseln vorkommen.

                Kommentar


                • #9
                  ok .. irgendwie fällt es mir noch schwer die abfragen dazu nun zu schreiben. also mal ein beispiel:

                  ich habe eine tabelle1 mit

                  id | text
                  ------------
                  1 | asdlkasdkm
                  2 | asdmasdm

                  und eine tabelle2 mit

                  t1id | andereid
                  ---------------
                  1 | 4
                  1 | 5
                  2 | 9

                  jetzt möchte ich die kompletten inhalte eines datensatzes von tabelle1 ausgeben und gleichzeitig die jeweils dazugehörigen inhalte von andereid auslesen. das am besten in einer SELECT-abfrage.

                  so funktioniert es zwar:
                  PHP-Code:
                  $data mysql_fetch_array(mysql_query("SELECT *, tabelle2.andereid AS ai FROM tabelle1, tabelle2 WHERE tabelle1.id = '1' AND tabelle2.t1id = '1'")); 
                  allerdings bekomme ich in phpmyadmin natürlich 2 zeilen .. da ai ja je verschieden ist. wie bekomme ich das jetzt in ein array? muss da dann php ran oder geht das auch noch mit mysql?

                  Kommentar


                  • #10
                    Normalerweise ist $data dann dein Result des aktuellen Datensatzes. Teste mal folgendes und schau dir die Variable (=Array) an.

                    PHP-Code:
                    <?php 
                      $id 
                    1;
                      
                    $sql "SELECT tabelle1.text AS text, tabelle2.andereid AS aid FROM tabelle1 INNER JOIN tabelle2 ON tabelle1.id = tabelle2.t1id WHERE tabelle1.id = '$id'";
                      
                    $qry mysql_query($sql) OR die(mysql_error());
                      while(
                    $res mysql_fetch_assoc($qry)) {
                        
                    $data[] = array('id' => $id'aid' => $res['aid'], 'text' => $res['text']);
                      }

                      echo 
                    "<pre>\n";
                      
                    print_r($data);
                      echo 
                    "</pre>\n";
                    ?>
                    Ich hoffe ich verzapf kein Mist und hoff au helfen gekonnt zu haben. Übernehme keine Haftung test es einfach mal.

                    Grüße
                    Psy

                    Kommentar


                    • #11
                      Ohne Überprüfung und Validierung:
                      PHP-Code:
                      <?php
                      $sql 
                      'SELECT * FROM tabelle1 WHERE id = 1 LIMIT 1';
                      $res mysql_query($sql);
                      $data1 mysql_fetch_assoc($res);
                      $data1['join'] = array();
                      $sql 'SELECT * FROM tabelle2 WHERE t1id = 1';
                      $res mysql_query($sql);
                      while (
                      $line mysql_fetch_assoc($res)) {
                        
                      $data1['join'][] = $line['andereid'];
                      }
                      print_r($data1);
                      ?>

                      Kommentar

                      Lädt...
                      X