Zeilennummer ermitteln, bei einer DB läufts bei der anderen nicht ?

joobi

Benutzer
Beiträge
24
Ich habe folgendes Query

SELECT tab.position, tab.id
FROM (SELECT l.id, @curRow := @curRow + 1 AS position FROM sys_listinfolinks l JOIN (SELECT @curRow := 0) r ORDER BY beschreibung ) tab WHERE id = 46

In einer MySql auf Server A findet er die RowNumber, in der andere MySql auf Server B tut er dies nicht.
obwohl das innere Query bei beiden korrekt funktioniert.

Man könnte glauben das bei der fehlerhaften Funktion, das äußere Query auf das innere angewendet wird,
und dadurch nur noch ein Datensatz für position enthalten ist.

Gibt es da eine Grundeinstellung in der DB.
Ich muss aber sagen ich habe die Datenbank von Server A aus dem MySQL exportiert und in da MySQL auf Server B importiert.

Oder ist das eine Einstellung in MySQL.
 
Werbung:
Zeilennummern ermittelt man via row_number() (passender Name, oder?). Kurzdemo:

Code:
edb=*# select * from t1;
         d          
--------------------
 05-SEP-21 00:00:00
 19-SEP-21 00:00:00
 25-SEP-21 00:00:00
(3 rows)

edb=*# 
edb=*# 
edb=*# select *, row_number() over (order by d) from t1;
         d          | row_number 
--------------------+------------
 05-SEP-21 00:00:00 |          1
 19-SEP-21 00:00:00 |          2
 25-SEP-21 00:00:00 |          3
(3 rows)

edb=*#
 
Warum funktioniert die Abfrage in der einen Datenbank und in der anderen nicht ?
Ich meine das liegt an einer Parametereinstellung in MySQL leider habe ich diese nicht dokumentiert.
 
Ich musste seit Jahren (wenn nicht Jahrzehnten) nicht mehr mit MySQL arbeiten, aber ich meine mich daran erinnern zu können, dass dieser Hack mit Variable hoch zählen in einem SELECT niemals offiziell unterstützt war. Vielleicht wurde da ja doch irgendwann mal aufgeräumt.
 
Welche Versionen nutz du auf beide Servern ?
Es gibt erst Probleme seit die Window Funktionen eingebaut wurden. Das Zählen ist kein "HACK" und wurde von MySQL und auch MariaDB in ihren Beispielen genutzt.
 
Es lag an der MySql Version.

SELECT tab.position FROM (SELECT id, row_number() over (order by beschreibung) AS position from sys_listinfolinks) tab WHERE id = 44;

so funktioniert es, schönen Dank.

8.0.27-0ubuntu0.20.04.1 funktioniert nicht mehr
8.0.20-0ubuntu0.20.04.1 funktioniert es noch
 
Also, MySQL:
1. ändert sein Verhalten zwischen Minorversionen
2. baut Features zurück und neue ein, zwischen Minorversionen

ok, 'Feature' für diesen unportablen Quatsch ist a bissl zu hoch gegriffen...

Aber okay, dafür hat es row_number() nun wohl gelernt. Immerhin.
 
Tja, da würd ich mal ein Ticket bei MySQL einstellen bzw. nachsehen ob das nicht schon jemand gemacht hat. Das Verhalten in Minorversionen sollte schon gleich sein ( da muss ich akretschmer "wieder" mal recht geben. kannst also ein zweites Kreuz machen)

 
Tja, da würd ich mal ein Ticket bei MySQL einstellen bzw. nachsehen ob das nicht schon jemand gemacht hat. Das Verhalten in Minorversionen sollte schon gleich sein ( da muss ich akretschmer "wieder" mal recht geben. kannst also ein zweites Kreuz machen)

Ist das aussichtsreich? Ich meine, wann kann man mit einer Korrektur rechnen?

Ich meine das liegt an einer Parametereinstellung in MySQL
Hast Du mal die SQL Modes geprüft / verglichen? Vielleicht hat sich ja dort nur ein Default geändert.
 
@joobi hatte davon geschrieben, dass er Einstellungen geändert hat, ohne es zu dokumentieren. Es ist nur ein Schuss ins Blaue, dass diese SQL Modes da ggF. helfen.
Ich hatte auch an Kompatibilitäts Settings gedacht, die man vielleicht zurück drehen könnte. Aber was ich im Kopf hatte, betrifft wohl eher die Exportfunktionen. Weiß nicht, ob es bei mySQL auch "richtige" Compatibility Settings gibt. Und wenn, wollte man von 8 zurück auf was älteres?
Wahrscheinlich ist die einfachste Lösung, die neue Version nicht zu verwenden.
 
Werbung:
Zurück
Oben