heinetz: HIlfe bei SQL-Statement

Hallo Forum,

So sieht in etwa meine MySQL-Tabelle aus:

+------+-----------------------+
|   id |      text |  position |
+======+===========+===========+
|  1   | irgendwas |         1 |
+------+---------------------+--
|  3   | irgendwas |         4 |
+------+---------------------+--
|  5   | irgendwas |         6 |
+------+---------------------+--
|  6   | irgendwas |         7 |
+------+---------------------+--

Ich würde die Tabelle gerne wie folgt updaten:

+------+-----------------------+
|   id |      text |  position |
+======+===========+===========+
|  1   | irgendwas |         1 |
+------+---------------------+--
|  3   | irgendwas |         2 |
+------+---------------------+--
|  5   | irgendwas |         3 |
+------+---------------------+--
|  6   | irgendwas |         4 |
+------+---------------------+--

Mit PHP hätte ich kein Problem. Aber geht das
auch mit nur einem SQL-Statement ?

danke für Tipps und

beste gruesse,
heinetz

  1. Hi!

    Mit PHP hätte ich kein Problem. Aber geht das auch mit nur einem SQL-Statement ?

    Wie genau würdest du das mit PHP machen? (nur rhetorisch gefragt) - Und hast du schonmal nachgesehen, ob MySQL auch Variablen kennt, mit denen man hochzählen kann?

    Lo!

    1. hi,

      Wie genau würdest du das mit PHP machen? (nur rhetorisch gefragt) - Und hast du schonmal nachgesehen, ob MySQL auch Variablen kennt, mit denen man hochzählen kann?

      <?  
      $mysqlStatm = '  
      SELECT *  
      FROM  `values`  
      $mysqlReslt = mysql_query($mysqlStatm);  
      $i=1  
      while ($temp = mysql_fetch_assoc($mysqlReslt))  
           {  
            $mysqlStatm = '  
            UPDATE `values` SET `position` WHERE `values`.`id` = '.$temp['id'];  
            $mysqlReslt = mysql_query($mysqlStatm);  
           }  
      ?>  
      
      

      Ich kenn nur auto_increment und hab keine Idee,
      wonach ich suchen sollte ;(

      gruesse,
      heinetz

      1. Hi,

        Wie genau würdest du das mit PHP machen? (nur rhetorisch gefragt)

        while ($temp = mysql_fetch_assoc($mysqlReslt))
             {
              ... mysql_query(...) ...

        Autsch. Datenbankabfragen in Schleifen == böse.

        Und hast du schonmal nachgesehen, ob MySQL auch Variablen kennt, mit denen man hochzählen kann?

        Ich kenn nur auto_increment und hab keine Idee,
        wonach ich suchen sollte ;(

        User-Defined Variables

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. hi,

          Autsch. Datenbankabfragen in Schleifen == böse.

          eben, deshalb frag ich ja, ob's eleganter geht.

          gruss,
          heinetz

    2. hi,

      ich hab etwas gefunden, was schon sehr gut geht !

        
      SET @c := 0;  
      UPDATE  `tabelle` SET  `position` = ( SELECT @c := @c + 1 )  
      ORDER BY id ASC;  
      
      

      ... schreibt den fortlaufenden Zähler in das Feld 'position'.

      Meine Tabelle ist dann aber doch komplexer ;)

      +------+-----------------------+-----------+
      |   id |      text |    gruppe |  position |
      +======+===========+===========+===========+
      |  1   | irgendwas |         1 |         0 |
      +------+-----------------------+-----------+
      |  3   | irgendwas |         2 |         0 |
      +------+-----------------------+-----------+
      |  5   | irgendwas |         2 |         0 |
      +------+-----------------------+-----------+
      |  6   | irgendwas |         3 |         0 |
      +------+-----------------------+-----------+
      | 16   | irgendwas |         1 |         0 |
      +------+-----------------------+-----------+

        
      SET @c := 0;  
      UPDATE  `tabelle` SET  `position` = ( SELECT @c := @c + 1 )  
      WHERE `gruppe` = 1  
      ORDER BY id ASC;  
      
      

      ... schreibt den fortlaufenden Zähler in das Feld 'position'
      für alle, die dem Kriterium gruppe = 1 entsprechen.

      Um innerhalb aller Gruppen zu sortieren, müsste ich das
      Ganze in diesem Fall für jede Gruppe absetzen. Da wäre
      ich wieder bei einer Schleife ... die ich natürlich gerne
      vermeiden würde ;)

      Sollte das gehen ? Hat jemand einen Tipp ?

      danke und

      beste gruesse,
      heinetz

      1. Hi!

        Um innerhalb aller Gruppen zu sortieren, müsste ich das Ganze in diesem Fall für jede Gruppe absetzen. Da wäre ich wieder bei einer Schleife ... die ich natürlich gerne vermeiden würde ;)
        Sollte das gehen ? Hat jemand einen Tipp ?

        Gehen tut das schon, irgendwie. Es wäre zu überlegen, welchen Aufwand die verschiedenen Lösungen bedeuten. Willst du das nur einmalig machen, dann ist der Rechenaufwand ziemlich nebensächlich. Musst du das ständig machen, kommt es darauf an. MySQL kennt keine variablen Variablen, so dass du nicht pro Gruppe eine und mit automatisch vergebenem Namen anlegen kannst. Aber - siehe Kapitel zu den benutzerdefinierten Variablen - du kannst dir auf SQL-Ebene Prepared Statements aus einem String erstellen. Das schätzte ich aber insgesamt recht aufwendig ein. Du musst ja auch noch die Anzahl der Gruppen ermitteln und in einer Schleife die Variablen anlegen, sonst haben nicht vorhandene Variablen den Wert NULL und der kommt auch wieder raus, wenn man was dazu addiert. Oder du verwendest bei jedem Lesezugriff COALESCE(@var, 0). Am Ende sollte das Ganze auch noch in einer Stored Procedure gekapselt werden. - Da ist also schätzungsweise auch noch eine Menge Lernarbeit dabei. - Sind es nur wenige Gruppen, dann ist die Schleife in PHP im Verhältnis dazu halb so wild, als es sich anhört.

        Lo!

        1. hi,

          danke, dann bin ich beruhigt !

          gruss,
          heinetz