SQL SELECT MAX() liefert rowcount = 1 auch bei keinem Treffer

  • Ersteller Ersteller Caspian DeConwy
  • Erstellt am Erstellt am
C

Caspian DeConwy

Gast
Hi,

ich habe eine MySQL-DB mit Artikelnummern, zu der ich die nächst höhere Artikelnummer hinzufügen möchte.

Ich suche als die aktuell größte Nummer und addiere 1 :cool_alt:

Das Problem ist nun, dass ich mit SELECT MAX(artnum) FROM DB auch dann mysqli_num_rows == 1 erhalte, wenn keine Artikelnummer vorhanden ist. Selbst mit `artnum` IS NOT NULL

Bild 007.jpg


Die Artikelnummern bestehen aus 6 Buchstaben und 6 Ziffern, wobei ich keine generell forlaufende Nummern habe, sondern je nach Marke unterschiedliche Nummern (z.B. MARKEX100001 und MARKEY100008). Deswegen muss ich noch nach bestimmten Kritrien filtern und benötige nicht die absolut gößte Artikelnummer.
 
Du bekommst halt einen Datensatz zurück, welcher den Wert NULL beinhaltet. Wo ist hier das Problem? Prüf auf null und setz es auf 0, sowie addiere 1. Mit PHP 7 und dem Null Coalescing Operator absolut kein Hexenwerk und mit nem Einzeiler erledigt.
 
  • Gefällt mir
Reaktionen: rg88
Wenn du das nur durch Prüfen der Anzahl der Antwortzeilen und nicht anhand deren Inhalt machen willst würde ich es so machen:
Code:
SELECT * FROM (SELECT MAX(artnum) AS artnum FROM DB WHERE artnum LIKE 'MARKEX%') WHERE artnum IS NOT NULL;
Das ist jetzt nicht besonders schön und es gibt vermutlich bessere Lösungen, aber das sollte funktionieren.
 
Das Problem ist die Verwendung von MAX. Da muss man mit HAVING arbeiten.
SQL:
SELECT MAX( `artnum` ) AS `artnum`
FROM DB
WHERE `artnum` LIKE 'MARKEX%'
HAVING `artnum` IS NOT NULL

Es geht aber auch ohne MAX.
SQL:
SELECT `artnum`
FROM DB
WHERE `artnum` LIKE 'MARKEX%'
ORDER BY `artnum` DESC
LIMIT 0 , 1
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Caspian DeConwy
Danke euch, ich teste es mit @Andreas_ Variante. Ist es so definiert, dass man bei MAX (und ähnlichen Funktionen) immer eine Rückgabe bekommt?

@Yuuri: klar könnte ich hinterher noch filtern o.ä., aber es ist halt wieder weiterer Code, den ich vermeiden will.
 
Max ist eine Gruppenfunktion. NULL ist auch eine Gruppe, wenn man sie nicht mit Having ausgrenzt.

Ich habe mein Posting überarbeitet.
 
Caspian DeConwy schrieb:
klar könnte ich hinterher noch filtern o.ä., aber es ist halt wieder weiterer Code, den ich vermeiden will.
Wieso filtern und weiterer Code?
Code:
<?php

if( $q->num_rows() === 1 )
{
    $currentNumber = $q->fetch_array()[0];
}
else
{
    $currentNumber = 1; // ?
}

// oder

$currentNumber = $q->fetch_array()[0] ?? 0;

// oder ohne Null Coalescing

$currentNumber = $q->fetch_array()[0] ?: 0;



$nextNumber = $currentNumber + 1;
 
Caspian DeConwy schrieb:
Danke euch, ich teste es mit @Andreas_ Variante. Ist es so definiert, dass man bei MAX (und ähnlichen Funktionen) immer eine Rückgabe bekommt?

MySQL wird doch eine knowledge base haben wie bspw auch Microsoft seine Technet. Dort steht, was die Rückgabewerte sind bei den verschiedenen Möglichkeiten. Unter T-SQL gibt MAX ein NULL zurück, was vor allem damit zusammenhängt, dass es ja eine Aggregatfunktion ist die bei GROUP BY ein Ergebnis benötigt.
 
Zurück
Oben