SELECT MAX MySQL Abfrage hackt :/
Kris
- php
Abend allerseits ...
Ich weiß nicht warum aber ich habe scheinbar einen kleinen Denkfehler. Ob es an der Syntax liegt oder einfach nur an einem dummen Schreibfehler hab ich immer noch nicht rausgefunden.
Ich will aus einer Reihe die NICHT AutoIncrement den aktuell höchsten holen und dann in einer Variable als nächst möglich hohen speichern.
Sprich Reihe A hat als höchste Zahl 12 - somit soll meine Variable 13 entsprechen. Mit NUM_ROWS wird das nicht funktionieren, da evtl. auch mal eine Reihe gelöscht (das im vorraus)
bisher sieht es so aus :
$query = "SELECT MAX(zahl) AS zahl FROM table\_xyz
";
$result = mysql_query($query);
$row = mysql_fetch_row($result);
$neuezahl = $row[0] + 1;
--- ODER ---
$query = "SELECT MAX(zahl) AS zahl FROM table\_xyz
";
$result = mysql_query($query);
$row = mysql_result($result_post, 0);
$neuezahl = $row + 1;
beides funktioniert nicht und bleibt genau bei der Variable $row kleben :/
Das erste Query verläuft reibungslos ...
wer kann mir helfen ? :/
mfg
KRIS !
echo $begrüßung;
beides funktioniert nicht und bleibt genau bei der Variable $row kleben :/
"bleibt kleben" ist leider nicht nachvollziehbar. Beschreibe bitte genau, was passiert oder auch was nicht passiert.
Das erste Query verläuft reibungslos ...
Da du nur zwei Querys gegeben hast, die beide "kleben bleiben", ist diese Aussage widersprüchlich.
$query = "SELECT MAX(zahl) AS zahl FROM
table\_xyz
";
$result = mysql_query($query);
$row = mysql_result($result_post, 0);
Was passiert denn, wenn du mal die MySQL-Fehlermeldungen nicht unter den Tisch fallen ließest und auf beide unterschiedliche Rückgabewerte (Resource und false) von mysql_query() angemessen reagiertest? Ein Beispiel für eine Abfrage inklusive Fehlerauswertung findest du im Kapitel zu MySQL im PHP-Handbuch
Fällt dir was auf, wenn du mal dein Script laufen lässt, wenn das error_reporting auf E_ALL steht?
echo "$verabschiedung $name";
"bleibt kleben" ist leider nicht nachvollziehbar. Beschreibe bitte genau, was passiert oder auch was nicht passiert.
er kann nicht weiterrechnen mit den Variablen da er Fehler ausgibt und die Variablen folglich als leer definiert werden.
Da du nur zwei Querys gegeben hast, die beide "kleben bleiben", ist diese Aussage widersprüchlich.
evtl. falsch ausgedrückt. Die Querys funktionieren beide jeweils ... lediglich die $result Variable wird nicht berechnet !
dank folgender Fehler :
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource
Warning: mysql_result(): supplied argument is not a valid MySQL result resource
Die Querys liefer auf alle fälle einen WiedegabeWert, das habe ich über PHPmyAdmin geklärt ...
echo $begrüßung;
Die Querys funktionieren beide jeweils ... lediglich die $result Variable wird nicht berechnet !
dank folgender Fehler :Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource
Dieser Fehler ist ein sicheres Zeichen dafür, dass die Query nicht gelaufen ist. mysql_query() gibt im Fehlerfall false statt einer Resource, die die mysl_fetch-Funktionen als Parameter erwarten, zurück. Ich wiederhole mich: Ignoriere die MySQL-Fehlermeldungen nicht (mysql_error() abfragen!) und baue deine Abfrage gemäß dem Beispiel im Handbuch um.
echo "$verabschiedung $name";
omg viel dank Dedlix ... da sucht man den Fehler wie blöd und merkt ... der error will mir eigentlich sagen das ich nicht in falschen Datenbank suchen sollte -.-
gruß
KRIS
P.S. mysql_error() hab ich bisher nie wirklich genutzt ... sehr fatal und nun weiß ich warum es so wichtig sein kann ;)
Hello,
omg viel dank Dedlix ... da sucht man den Fehler wie blöd und merkt ... der error will mir eigentlich sagen das ich nicht in falschen Datenbank suchen sollte -.-
... deshalb solltest Du nicht nur alle Statusmeldungen (Fehlercodes) auswerten, sondern auch immer über ein qualifiziertes Handle (Connection) zugreifen.
Außerdem hat Deine Überlegung noch eine dicke Macke, die im aktiven Betrieb zu Fehlern führen wird.
Deine Vorgehensweise müsste auf jeden Fall so aussehen:
sperre Tabelle
hole größten Wert
zähle ih eins rauf
speichere neuen Satz
entsperre Tabelle
Das gilt auch für MySQL, nicht nur für Zähler auf Flatfilebasis.
Wenn Du aber das Select und das Insert Statement in einem gemeinsamen zusammenbauen kannst, dann kannst Du Dir das Sperren sparen, da einzelne Queries DBMS-weit serialisiert und atomar ausgeführt werden. Das gilt aber eben nicht, wenn Du zwei Queries benötigst. Da passen dann beliebig viele andere Queries anderer Connections dazwischen.
Ich weiß leider nicht, ob man mit MySQL inzwischen ein Subselect auf Max() in ein Insert einbauen kann. Wer kann helfen?
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Freunde des gehobenen Forumsgenusses,
Ich weiß leider nicht, ob man mit MySQL inzwischen ein Subselect auf Max() in ein Insert einbauen kann. Wer kann helfen?
Eine Methode wäre z.B. folgende:
update table_xyz set zahl = zahl + 1 order by zahl desc limit 1;
Frag mich nicht, ob das langsamer als max() ist, keine Ahnung.
Gruß
Alexander Brock
Hello,
Eine Methode wäre z.B. folgende:
update table_xyz set zahl = zahl + 1 order by zahl desc limit 1;
Hast Du das mal ausprobiert?
Update und Order passen nicht in ein Statement...
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Freunde des gehobenen Forumsgenusses,
Hast Du das mal ausprobiert?
Ja. Es funktioniert unter W2K mit Mysql 4.fragmichnich
Update und Order passen nicht in ein Statement...
Irgendwie doch.
Gruß
Alexander Brock
Hello,
Hast Du das mal ausprobiert?
Ja. Es funktioniert unter W2K mit Mysql 4.fragmichnich
Update und Order passen nicht in ein Statement...
Irgendwie doch.
Ist ja heiß. Ich war der Meinung, dass Order nur die Ausgabemenge sortiert.
Und Update hat gar keine.
Steht da tatsächlich, dass das geht
http://dev.mysql.com/doc/refman/4.0/de/update.html
Bei meiner ollen Version geht es noch nicht.
Update test set X=X+1 order by X limit 4;
liefert
Fehler in der Syntax bei 'order by X limit 4' in Zeile 1.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Moin!
Steht da tatsächlich, dass das geht
http://dev.mysql.com/doc/refman/4.0/de/update.html
Nein, im Handbuch der Version 4.0 steht nicht, dass es geht. Das Syntaxdiagramm schreibt nichts von "ORDER BY". Dass im Text davon gesprochen wird, halte ich für einen Übersetzungsfehler. Die englische Version steht aber schon nicht mehr zur Verfügung.
Im Handbuch der Version 4.1 steht, dass es geht:
http://dev.mysql.com/doc/refman/4.1/en/update.html
- Sven Rautenberg
echo $begrüßung;
Die englische Version [des 4.0er Handbuchs] steht aber schon nicht mehr zur Verfügung.
Wenn ältere Versionen nicht mehr online lesbar sind, dann sollten sie aber noch in den Download-Paketen zu den jeweiligen Versionen enthalten sein. Wobei manchmal schon in Paketen, zu dessen Veröffentlichungszeitpunkt schon eine neuere Version bekannt war, das neuere Handbuch enthalten ist. "Richtige" x.y-er Handbücher sind also meist in den frühen x.y-er Versionen zu finden.
echo "$verabschiedung $name";
Hallo Alexander,
Ich weiß leider nicht, ob man mit MySQL inzwischen ein Subselect auf Max() in ein Insert einbauen kann. Wer kann helfen?
Eine Methode wäre z.B. folgende:
update table_xyz set zahl = zahl + 1 order by zahl desc limit 1;
statt einen neuen Datensatz mit einem bestimmten Wert einzufügen, veränderst Du die Werte _aller_ Datensätze.
Frag mich nicht, ob das langsamer als max() ist, keine Ahnung.
Es ist etwas völlig anderes, also spielt die Geschwindigkeit keine Rolle :-)
Freundliche Grüße
Vinzenz
Hallo Freunde des gehobenen Forumsgenusses,
Eine Methode wäre z.B. folgende:
update table_xyz set zahl = zahl + 1 order by zahl desc limit 1;
statt einen neuen Datensatz mit einem bestimmten Wert einzufügen, veränderst Du die Werte _aller_ Datensätze.
Nein, ich sortiere absteigend nach Größe und ändere nur den obersten (limit 1).
Gruß
Alexander Brock