Hendrik: MAX(id) klappt nicht!

Hey!

Es ist total merkwürdig. Ich habe eine Tabelle mit den Spalten id, name, irgendwas. Das Feld id ist kein primary key, sondern ich verwalte es selber:
Wenn ein bestimmter user ($name) auf diese Seite kommt, soll der Datensatz angefordert werden werden, der _seine_ größte, und damit auch zuletzt eingetragene id beinhaltet. Ich dachte das geht so:

  
$query = "SELECT MAX(id) FROM tabelle WHERE name = '$name'"; //Der Name steht natürlich auch in der Variablen $name  
$sql = mysql_query($query)  
or die(mysql_error());  
$max = mysql_result($sql, 0);  

In der Variablen $max sollte jetzt ja eigentlich seine größte id stehen, steht aber nicht. Wenn ich bei phpmyAdmin nachsehe, dann frage ich mich auch jedesmal, nach welcher Reihenfolge diese Datensätze bitte eingeschrieben werden...

Danach wollte ich eigentlich einen neuen Eintrag einschreiben, bei dem die id dann um eins größer ist, als die maximale.

  
$id = $max + 1;  
  
$query = "INSERT INTO tabelle SET  
id = '$id',  
name = '$name',  
irgendwas = '$irgendwas'  
";  
$sql = mysql_query($query);  

Woran liegt es denn, dass es so nicht klappt? GROUP ID, ORDER BY, LIMIT? Ausgegeben wird nicht die größte Zahl sondern eine andere aus der Tabelle (bei der name allerdings auch $name ist!), und eingeschrieben natürlich diese falsche Zahl + 1. Ich habe kein Ahnung und hoffe, ihr könnt mir helfen!

Hendrik

--
-------------------
Zur Info: Ich habe leider nur PHP 4.4.2 zur Verfügung!
-------------------
ie:% fl:| br:> va:) ls:[ fo:) rl:( n4:° ss:| de:> js:| ch:? sh:( mo:) zu:)
SELFCode Decoder
  1. $query = "SELECT MAX(id) FROM tabelle WHERE name = '$name'"; //Der Name steht natürlich auch in der Variablen $name

      
    ~~~php
      
    $query = "SELECT MAX(id) AS id FROM tabelle WHERE name = '". $name ."'";  
    
    

    probiers mal hiermit :)

    1. Hey!

      $query = "SELECT MAX(id) FROM tabelle WHERE name = '$name'"; //Der Name steht natürlich auch in der Variablen $name

      
      >   
      > ~~~php
        
      
      > $query = "SELECT MAX(id) AS id FROM tabelle WHERE name = '". $name ."'";  
      > 
      
      

      probiers mal hiermit :)

      Was sollte das denn für einen Unterschied machen? Ich kann doch schreiben:
      $name = $nachname;
      und ich kann das hier schreiben:
      $name = "$nachname";

      Kein Unterschied!

      Hendrik

      --
      -------------------
      Zur Info: Ich habe leider nur PHP 4.4.2 zur Verfügung!
      -------------------
      ie:% fl:| br:> va:) ls:[ fo:) rl:( n4:° ss:| de:> js:| ch:? sh:( mo:) zu:)
      SELFCode Decoder
      1. Hi !

        Was sollte das denn für einen Unterschied machen? Ich kann doch schreiben:
        $name = $nachname;
        und ich kann das hier schreiben:
        $name = "$nachname";

        Kein Unterschied!

        Ja, weil Du einer Variable EINEN Wert zuweist. Wenn Du einen String aus mehreren Werten zusammenbaust, der danach eine bestimmte Syntax hat, mußt Du es so machen, wie Kris es geschrieben hat.

        Bsp.:

        $Text="Heute ist ein schöner Tag";

        Mit Variable

        $Text="Heute ist " .$variable. " schöner Tag";

        Wenn die Variable in einfachen Hochkomma stehen soll, dann

        $Text="Heute ist '" .$variable. "' schöner Tag";

        Wenn $variable=1 ist, dann steht in $Text:

        Heute ist '1' schöner Tag

        Gruß

        Hans

        1. echo $begrüßung;

          Wenn Du einen String aus mehreren Werten zusammenbaust, der danach eine bestimmte Syntax hat, mußt Du es so machen, wie Kris es geschrieben hat.

          Nein, muss er überhaupt nicht. Sein $query-Zusammenbau war korrektes PHP. Das ist garantiert nicht das Problem gewesen.

          Ich tippe ja eher auf einen Stringtyp als Datentyp der ID-Spalte ...

          echo "$verabschiedung $name";

          1. Hallo dedlfix,

            Ich tippe ja eher auf einen Stringtyp als Datentyp der ID-Spalte ...

            das meint meine Glaskugel auch.

            Freundliche Grüße

            Vinzenz

            1. Hey!

              Ich tippe ja eher auf einen Stringtyp als Datentyp der ID-Spalte ...

              das meint meine Glaskugel auch.

              Ach, ihr habt ja so Recht! Ich hatte varchar genommen, jetzt habe ich es auch smallint umgestellt, und aller funktioniert. Glaubt jetzt bloß nicht, dass ich id-Felder immer als varchar erstelle. Ich erstelle sie immer mit smallint! Hab wohl aus Versehen varchar genommen...

              Was ich noch mal sagen wollte: Ich finde es total nett, dass sich hier immer so viele Menschen mit meinem Problem befassen, und mir dazu noch immer die richtigen Lösungen geben. VIELEN DANK DAFÜR!

              Hendrik

              --
              -------------------
              Zur Info: Ich habe leider nur PHP 4.4.2 zur Verfügung!
              -------------------
              ie:% fl:| br:> va:) ls:[ fo:) rl:( n4:° ss:| de:> js:| ch:? sh:( mo:) zu:)
              SELFCode Decoder
              1. Moin!

                Ach, ihr habt ja so Recht! Ich hatte varchar genommen, jetzt habe ich es auch smallint umgestellt, und aller funktioniert. Glaubt jetzt bloß nicht, dass ich id-Felder immer als varchar erstelle. Ich erstelle sie immer mit smallint! Hab wohl aus Versehen varchar genommen...

                Smallint hat allerdings nur einen vergleichsweise kleinen Wertebereich, genauer gesagt: Bei 32767 ist Schluß (16 Bit mit Vorzeichen).

                Sofern du mehr Datensätze kriegst, kriegst du damit ein Problem.

                Tipp: IDs als "UNSIGNED INT" vergeben. Dann hast du komplette 32 Bit Zahlenbereich (0 bis 4.294.967.295) - das sollte reichen und kostet dich nur 2 Byte je Datensatz mehr.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. Hey!

                  Smallint hat allerdings nur einen vergleichsweise kleinen Wertebereich, genauer gesagt: Bei 32767 ist Schluß (16 Bit mit Vorzeichen).

                  Sofern du mehr Datensätze kriegst, kriegst du damit ein Problem.

                  Tipp: IDs als "UNSIGNED INT" vergeben. Dann hast du komplette 32 Bit Zahlenbereich (0 bis 4.294.967.295) - das sollte reichen und kostet dich nur 2 Byte je Datensatz mehr.

                  Ich glaube zwar nicht, jemals mehr als 32767 als id-Wert bekomme, aber andererseits werden es auch rasend schnell größere Zahlen. Bei einem Forum z.B. kann ich es mir sehr hilfreich vorstellen. Ich werden es in Zukunkt so machen!
                  Danke!

                  Hendrik

                  --
                  -------------------
                  Zur Info: Ich habe leider nur PHP 4.4.2 und MySQL 4.1.20 zur Verfügung!
                  -------------------
                  ie:% fl:| br:> va:) ls:[ fo:) rl:( n4:° ss:| de:> js:| ch:? sh:( mo:) zu:)
                  SELFCode Decoder
      2. Hallo,

        was erwartest du, wenn du die Max-Funktion auf nur eine Untermenge der gesamten Tabelle (dank der WHERE Clause) anwendest. Dann wird es auch nur von diesem Subset den Maximalen Wert von Id nehmen, egal wie viele andere höhere Ids in der Tabelle noch vorhanden sind.

        Cheers,
        Frank

  2. probiers mal mit

    INSERT INTO Tabelle1 (id, spalte1, spalte2) VALUES ( (SELECT MAX(ID) FROM Tabelle2), 'Wert1','wert2')

    mfg
    Micha

    --
    viel Spass: ie:{ fl:) br:> va:( ls:[ fo:) rl:? n4:{ ss:{ de:> js:} ch:? sh:( mo:) zu:]
    1. Hi,

      INSERT INTO Tabelle1 (id, spalte1, spalte2) VALUES ( (SELECT MAX(ID) FROM Tabelle2), 'Wert1','wert2')

      super Vorschlag. Ich würde sagen das gibt bei einem normalen Datenmodel ein "Duplicate entry for index ...", weil du die selbe ID nochmal vergibst. Rechne bitte wenigstens eins drauf.

      Ansonsten: Hendrik, warum machst du dir die Mühe ein Konstrukt von Hand zu erzeugen, was eigentlich schon da ist. Auto_Increment unterstützen fast alle Datenbanken auf die ein oder andere Weise ab Werk, dann brauchst du auch keine freien Werte zu suchen oder sonstwas.

      MfG
      Rouven

      --
      -------------------
      Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
      1. Hallo Rouven,

        INSERT INTO Tabelle1 (id, spalte1, spalte2) VALUES ( (SELECT MAX(ID) FROM Tabelle2), 'Wert1','wert2')
        super Vorschlag. Ich würde sagen das gibt bei einem normalen Datenmodel ein "Duplicate entry for index ...", weil du die selbe ID nochmal vergibst. Rechne bitte wenigstens eins drauf.

        es ist ja noch viel schlimmer. Tabelle1 und Tabelle2 sind nach Aussagen von Hendrik identisch, d.h. es kommt zu einer SQL-Fehlermeldung.

        <zitat>
        The INSERT ... SELECT form inserts rows selected from another table or tables
        </zitat>

        Und zuguterletzt hat Micha noch die WHERE-Klauses unterschlagen ...

        Freundliche Grüße

        Vinzenz

  3. Hallo Hendrik,

    SELECT MAX(id) FROM tabelle WHERE name = 'irgendwas'

    [...]

    Ausgegeben wird nicht die größte Zahl sondern eine andere aus der Tabelle (bei der name allerdings auch $name ist!),

    Du hast also wohl eher ein SQL-Problem, nicht ein PHP-Problem. Insofern wäre es nett, wenn Du uns von PHP gereinigte Anweisungen präsentiertest.

    Wie lautet das SQL-Statement, das PHP an MySQL weiterreicht (eine Zeichenkette ohne irgendwelche Variablen bitte)?
    Welcher Wert wird ausgegeben?
    Welchen erwartest Du?
    Welchen Datentyp hat die Spalte id?

    Freundliche Grüße

    Vinzenz