Michael Wölk: MySQL...

Hallo,

ich weiss zwar wie ich einträge hinzufüge und lösche aber nicht wie ich folgendes machen kann:

a b
1 1
1 2
1 3
1 4
2 1
2 2
3 1
3 2
3 3
3 4
3 5

stellt euch vor b ist ein eintrag und a bündelt die einträge (zb. ein board forum)
ich möchte jetzt bei a 2 einen 3. eintrag hinzufügen also hier:

a b
1 1
1 2
1 3
1 4
2 1
2 2
2 3 <-
3 1
3 2
3 3
3 4
3 5

wie muss der befehl lauten?

Danke
Micvhael Wölk

  1. Hallo,

    der Eintrag müsste ganz normal lauten:

    mysql_query("insert into tabellenname set a='2', b='3';");

    erst bei der Abfrage mußt Du dann sortieren:

    $getdata=mysql_query("select a, b from tabellenname order by char_length(a) asc, a asc, char_length(b) asc, b asc");

    Wenn Du Integerfelder hast, kannst Du die char_length(x) asc Teile weg lassen, die sind nur z.B. für Varcharfelder, damit die Strings erst in der Länge und dann bei gleicher Länge noch aufsteigend sortiert werden.

    Ich hoffe, ich habe Deine Frage richtig verstanden.

    Viele Grüße

    1. Hi,

      mysql_query("insert into tabellenname set a='2', b='3';");

      erst bei der Abfrage mußt Du dann sortieren:

      hm das ist kompliziert... aber naja sollte klappen.

      $getdata=mysql_query("select a, b from tabellenname order by char_length(a) asc, a asc, char_length(b) asc, b asc");

      puh damit muss ich mich erst noch beschäftigen.

      Ich hoffe, ich habe Deine Frage richtig verstanden.

      glaube schon: also erst kommt der neue eintrag ans ende

      a b
      1 1
      1 2
      1 3
      1 4
      2 1
      2 2
      3 1
      3 2
      3 3
      3 4
      3 5
      2 3 <-

      dann wird sortiert:

      a b
      1 1
      1 2
      1 3
      1 4
      2 1
      2 2
      2 3 <-
      3 1
      3 2
      3 3
      3 4
      3 5

      und mit $getdata=mysql_query("select a, b from tabellenname order by char_length(a) asc, a asc, char_length(b) asc, b asc"); wird das genau so sortiert?

      geht das wirklich nicht einfacher zb einen befehl
      mysql_query("insert into tabellenname set a='2', b='3'; where a='2'"); (und noch irgendwas, wo es weis: aha 2,1 2,2 2,3 also ans ende von den zweiern).

      MfG
      Michael Wölk

      1. Hallo,

        ----------
        <geht das wirklich nicht einfacher zb einen befehl
        mysql_query("insert into tabellenname set a='2', b='3'; where a='2'"); (und noch irgendwas, wo es weis: aha 2,1 2,2 2,3 also ans ende von den zweiern).
        ----------

        das ist so:
        PHP liest, wenn keine Sortierreihenfolge angegeben ist, die Datensätze immer in der Reihenfolge ein, in der sie in der Tabelle stehen. Wenn Du jetzt mit phpmyadmin deine Tabelle nach einem anderen Feld sortierst, sind alle wieder anders angeordnet, das heißt dein Script bekommt die Datensätze immer in willkürlicher Reihenfolge. Deshalb mußt Du sie mit dem MySQL-Befehl order by sortieren (was auch wesentlich schneller und einfacher ist, als eine Sortierung mit PHP).

        order by char_length(a) asc, a asc, char_length(b) asc, b asc

        das ist ganz einfach:
        angenommen du hast folgende Tabelle:

        a  b
        11 5
        3  19
        7  8
        3  4

        dann kommt char_lenth(a) asc:

        a  b
        3  19
        7  8
        3  4
        11 5

        dann kommt a asc:

        a  b
        3  19
        3  4
        7  8
        11 5

        und dann eben noch das gleich für b order by sortiert immer das zuerst, was Du zuerst hinschreibst (char_length(a) asc... usw.) und läßt das auch so sortiert, das heißt, was vorn steht, ist in der Sortier-Priorität am wichtigsten.

        Viele Grüße

        1. angenommen du hast folgende Tabelle:

          a  b
          11 5
          3  19
          7  8
          3  4

          dann kommt char_lenth(a) asc:

          a  b
          3  19
          7  8
          3  4
          11 5

          dann kommt a asc:

          a  b
          3  19
          3  4
          7  8
          11 5

          aha - versteh ich leider nicht bzw. nur teilweise: ich denke dieses asc sortiert nach stringlänge aber ich muss doch nur nach zahlen sortieren und zwar das am ende die reihenfolge so aussieht:

          1 1
          1 2
          1 3
          1 4

          2 1
          2 2
          2 3

          3 1
          3 2
          3 3
          3 4

          also erst nach a, dann nach b oder?

          angenommen das sieht unsortiert so aus:

          3 1
          1 4
          1 2
          3 2
          1 3
          2 1
          2 2
          1 1
          3 4
          2 3
          3 3

          dann sortiere ich nach a:

          1 4
          1 2
          1 3
          1 1
          2 1
          2 2
          2 3
          3 1
          3 2
          3 4
          3 3

          und wenn ich dann noch nach b sortiere, sollte alles richtig stehen, oder? Aber brauch ich das asc jetzt oder nicht?

          MfG
          Michael Wölk

          1. Hallo Michael!

            1.) Wie Manfred schon richtig fest gestellt hat, hast Du keinen Einfluß darauf, wie die Daten in die Datenbank kommen - das übernimmt der Datenbankserver.

            2.) Daher musst Du sie beim Auslesen entsprechend sortieren. Auch dazu kam bereits ein Beispiel.

            ASC bedeutet einfach aufsteigend - es gibt auch noch DESC für absteigend.

            Wenn Du nur Zahlen verwendest, kannst Du einfach danach sortieren - Manfred dachte wahrscheinlich, dass die Werte als String vorliegen - da müsstest du auch die Stringlänge berücksichtigen, da in diesem Fall wie folgt sortiert würde:

            1
            10
            11
            2
            21
            22
            usw.

            Dein Select lautet also einfach:

            select a,b from tabelle order by a, b;

            (asc ist üblicherweise default - wenn nicht, dann ... order by a asc, b asc,)

            mfg

            norbert =:-)

            1. Guden Norbert,

              Dein Select lautet also einfach:

              select a,b from tabelle order by a, b;

              ich werds Probieren!

              (asc ist üblicherweise default - wenn nicht, dann ... order by a asc, b asc,)

              OK

              Danke
              MfG
              Michael Wölk

              1. Hallo,

                wie ich ja weiter oben bereits geschrieben habe,
                kannst du die char_lenth... Teile weglassen, wenn Du ein Integer-Feld hast (nur bei String-Felder werden die benötigt).
                Das wird schon :)

                Viele Grüße

                1. Hallo,

                  wie ich ja weiter oben bereits geschrieben habe,
                  kannst du die char_lenth... Teile weglassen, wenn Du ein Integer-Feld hast (nur bei String-Felder werden die benötigt).
                  Das wird schon :)

                  Viele Grüße

                  Ja klar :-)
                  aber ich hab da noch zwei letzte fragen:
                  1. wie sieht jetzt der entgültige befehl aus:

                  mysql_query("select a,b from $table order by a asc, b asc");

                  so?

                  und
                  2. wo muss ich den befehl positionieren? vor der ausgabe oder am besten nach der abfrage der db oder?

                  MfG
                  Michael Wölk

                  1. Hallo Michael!

                    Was Du mit den Daten anstellst, bleibt Dir überlassen - grundsätzlich siehts so aus.

                    ... connect database ...

                    $result = mysql_query("select a, b from tabelle order by a, b")
                     or die ("Abfrage fehlgeschlagen ...<br><br>");

                    if (mysql_num_rows($result) > 0)
                     {
                      while($row = mysql_fetch_array($result))
                      {
                       print($row['a'] . ' - ' . $row['b'] . "<br>\n");
                      }

                    mfg

                    norbert =:-)

                    1. $result = mysql_query("select a, b from tabelle order by a, b")
                       or die ("Abfrage fehlgeschlagen ...<br><br>");

                      Das War´s - Danke

                      MfG
                      Michael Wölk

                  2. Hallo,

                    1. wie sieht jetzt der entgültige befehl aus:

                    mysql_query("select a,b from $table order by a asc, b asc");

                    Genau, der Vollständigkeit halber hinten noch ein ;

                    Connecten... dann:

                    $getdata=mysql_query("select a, b from $table order by a asc, b asc;");

                    mysql_close();

                    for ($i=0; $i<mysql_num_rows($getdata); $i++)
                      {
                      mysql_data_seek($getdata, $i);
                      $data=mysql_fetch_array($getdata, MYSQL_BOTH);

                    echo ($data[a].' - '.$data[b]);
                      }

                    1. wo muss ich den befehl positionieren? vor der ausgabe oder am besten nach der abfrage der db oder?

                    Das versteh ich jetzt nicht ganz...
                    Du öffnest die Datenbank, führst Deine Abfrage durch und schließt mit mysql_close(); so bald wie möglich wieder die Datenbank.

                    Viele Grüße

            2. select a,b from tabelle order by a, b;

              äh... hm.... wie lautet den jetzt eigentlich der ganze befehl?
              ich bin durcheinander denn bei Manfred sah das so aus:
              $getdata=mysql_query("select a, b from tabellenname order by char_length(a) asc, a asc, char_length(b) asc, b asc");

              aber muss $getdata nicht noch irgendwie ausgeführt werden oä. ?

              MfG
              Michael Wölk