MySQL Fehler: #1690 - BIGINT UNSIGNED value is out of range in...

BartTheDevil89

Devilution Media
ID: 87739
L
2 Mai 2006
3.960
103
Hallo zusammen,

seit kurzem spielt mein SQL mir einen Strich von einer alten NestedSet-Klasse, die ich nutze.
Das Ding versucht folgende Abfrage zu machen um das Level eines Eintrags zu ermitteln:
Code:
SELECT baum2.id AS id, COUNT(*) AS level FROM cms_menu_eintrag AS baum1, cms_menu_eintrag AS baum2 WHERE baum2.lft BETWEEN baum1.lft AND baum1.rgt and baum1.menu = '1' and baum2.menu = '1' GROUP BY baum2.lft ORDER BY ABS(baum2.id - 3)

SQL antwortet jetzt mit folgendem Fehler:
Code:
#1690 - BIGINT UNSIGNED value is out of range in '(`cms`.`baum2`.`id` - 3)'

Die Datenbank enthält folgende Daten:

id|lft|rgt|menu
------------------------------
1|0|5|1
3|1|2|1
4|3|4|1

Habt ihr ne Idee, woran das liegen kann bzw. wie ich die Problematik lösen kann?
Danke ;)
 
Code:
SELECT [COLOR="Red"]baum2.id[/COLOR] AS id, 
COUNT(*) AS level 
FROM cms_menu_eintrag AS baum1, 
cms_menu_eintrag AS baum2 
WHERE baum2.lft BETWEEN baum1.lft AND baum1.rgt 
and baum1.menu = '1' 
and baum2.menu = '1' 
GROUP BY [COLOR="Red"]baum2.lft[/COLOR] 
ORDER BY ABS(baum2.id - 3)

ganz verstehe ich die Query nicht. Ich dachte immer, dass alle Spalten der SELECT-Klausel entweder auch in der Group By Klausel auftauchen müssen oder aber Aggregatsfunktionen sein müssen.
Ist es denn üebrhaupt möglich, baum2.id in der Select-Klausel zu haben und baum2.lft im Group by ?
 
Nein, leider nicht wirklich: #1690 - BIGINT UNSIGNED value is out of range in '(cast(`cms`.`baum2`.`id` as unsigned) - 4)'
SELECT baum2.id AS id, COUNT( * ) AS level

Problem ist ja, dass es seit langem funktioniert hat und auch nichts geändert wurde. (höchsten server wurde geändert)
 
Welchen Wertebereich kann denn baum2.ID annehmen ?
Was passiert, wenn Du nach Decimal castest ?

Geht in MySQL sowas wie

Code:
ORDER BY ABS(CAST(baum2.id AS DECIMAL(11)) - 3)
 
ähh. Sorry, ich denke so ist es richtiger

Code:
ORDER BY ABS(CAST(baum2.id AS SIGNED) - 3)
zumindest erklärt das die Fehlerbeschreibung (nach Serverwechsel) da der Bug in mySQL 5.5 bekannt ist

Laut dem obigen Beispiel sollte auch schon ein INT oder TINYINT ausreichen. und ID als PrimaryKey könnte man sowieso als INT setzen, soweit mir das bekannt ist ;)
 
ähh. Sorry, ich denke so ist es richtiger

Code:
order by abs(cast(baum2.id as signed) - 3)
zumindest erklärt das die fehlerbeschreibung (nach serverwechsel) da der bug in mysql 5.5 bekannt ist

laut dem obigen beispiel sollte auch schon ein int oder tinyint ausreichen. Und id als primarykey könnte man sowieso als int setzen, soweit mir das bekannt ist ;)

1000dank ;)
 
ganz verstehe ich die Query nicht. Ich dachte immer, dass alle Spalten der SELECT-Klausel entweder auch in der Group By Klausel auftauchen müssen oder aber Aggregatsfunktionen sein müssen.
Ist es denn üebrhaupt möglich, baum2.id in der Select-Klausel zu haben und baum2.lft im Group by ?

MySQL kann das irgendwie, frag mich nicht warum, ich glaube das gruppiert dann autom. oder so. Lässt sich aber auch ausstellen und somit verhält sich dann MySQL wie jede andere relationale Datenbank.