MAX(ID) mit führenden Nullen (unsigned zerofill)

Chris Depré

B1G-Software-Kunde
#1
Ich habe eine DB-Abfrage, welche die höchste ID aus einer auto_increment und UNSIGNED ZEROFILL ermitteln soll. Funktioniert problemfrei, allerdings liefert die Abfrage die höchste ID ohne führende Nullen zurück:

Betroffene MySQL-Spalte:
Feld Typ Attribute Null Standard
id int(5) UNSIGNED ZEROFILL Nein auto_increment

Derzeit angewandte PHP-Abfrage:
Code:
function getMaxID()
{
$row=mysql_fetch_array(mysql_query("SELECT MAX(ID) FROM " . PRE . "accounts"));
return $row[0]+1;
}


Format der betroffenen MySQL-Zelle mit dem höchsten Wert:
'00005'

Resultat:
'5'
 

patrick

Staff member
B1G-Software-Kunde
#2
> return $row[0]+1;

Da wandelt PHP $row[0] in einen Integer um, um die 1 zu addieren, dabei kürzt PHP die Nullen weg, weil die ja nicht benötigt werden. Versuch es mal so:

PHP:
function getMaxID()
{
$row=mysql_fetch_array(mysql_query("SELECT MAX(ID) FROM " . PRE . "accounts"));
return(sprintf("%05d", $row[0]+1));
}
 

aaaaa

B1G-Software-Kunde
#4
Zuerst mal frage ich mich, weshalb du führende Nullen bei einem INT Wert hast. Entweder ist es eine Zahl, dann brauchst du keine Nullen oder es ist ein String.

Grundsätzlich merke ich aber immer wieder, wie wenig die Funktionen von SQL ausgenutzt werden. Nur als kleine Anmerkung sei deshalb hier mal LPAD empfohlen. Warum immer alles hinterher noch mit PHP umbiegen?

PHP:
$row=mysql_fetch_array(mysql_query("SELECT LPAD(MAX(ID), 5, '0') FROM " . PRE . "accounts"));
 

patrick

Staff member
B1G-Software-Kunde
#5
aaaaa said:
Zuerst mal frage ich mich, weshalb du führende Nullen bei einem INT Wert hast. Entweder ist es eine Zahl, dann brauchst du keine Nullen oder es ist ein String.

Grundsätzlich merke ich aber immer wieder, wie wenig die Funktionen von SQL ausgenutzt werden. Nur als kleine Anmerkung sei deshalb hier mal LPAD empfohlen. Warum immer alles hinterher noch mit PHP umbiegen?

PHP:
$row=mysql_fetch_array(mysql_query("SELECT LPAD(MAX(ID), 5, '0') FROM " . PRE . "accounts"));
Er addiert doch nach dem Query noch 1 auf den Wert, da entfernt PHP die Nullen, nicht MySQL...
 

aaaaa

B1G-Software-Kunde
#6
patrick said:
Er addiert doch nach dem Query noch 1 auf den Wert, da entfernt PHP die Nullen, nicht MySQL...
Ups, hatte ich übersehen. Und wieso addiert er das nicht gleich mit SQL. Und wozu überhaupt die führenden Nullen...?
PHP:
 $row=mysql_fetch_array(mysql_query("SELECT LPAD(MAX(ID)+1, 5, '0') FROM " . PRE . "accounts"));
 

patrick

Staff member
B1G-Software-Kunde
#7
Er hat wohl einen Grund für die Nullen...
Sicher, dass es schneller geht, wenn man MySQL neben seiner eigentlichen Aufgabe (DB-Server) auch noch für die Additionen benutzt?
 

aaaaa

B1G-Software-Kunde
#8
patrick said:
Sicher, dass es schneller geht, wenn man MySQL neben seiner eigentlichen Aufgabe (DB-Server) auch noch für die Additionen benutzt?
Nein, ich denke in dem Fall ist die PHP Lösung sogar schneller. Mein Einwurf war eigentlich auch eher grundsätzlich gedacht, ich wollte nicht speziell auf dieser Sache rumreiten. Doch sehe ich oft, wie in PHP etwas rumgebastelt wird, was sich viel besser im SQL lösen liese. Deshalb, seht meine Antworten eher als Denkanstoß, welche Möglichkeiten SQL bietet.
 

Chris Depré

B1G-Software-Kunde
#9
Mit dem letzten Satz hat aaaaa sicher nicht ganz Unrecht.

Danke patrick & aaaaa für die schnelle Hilfe.

Es handelt sich übrigens um eine eindeutige Login-ID (Account-Nummer) als Ersatz eines Benutzernamens welche nach Konvention stets 5stellig sein soll, daher die führenden Nullen.
 
Top