During the porting of an application from MySql to MariaDB, I found another curious fact: I get a different ORDER BY behaviour between MySql And MariaDB.
Look at this query:
SELECT DISTINCT Z.ID FROM ( SELECT Field1, Field2, Field3.... FROM Table1 ORD INNER JOIN Table2 OC ON ORD.OrderCopID = OC.ID LEFT JOIN Table3 NEG ON OC.NegID = NEG.ID .... WHERE 1=1 ORDER BY OC.ID DESC, ORD.Progr ) AS Z DESC LIMIT 0, 25 ) AS T
The expected result, and the one I get using MySql, is a table with one column containing a list of numeric IDs in descending order, due to the ORDER BY clause OC.ID DESC
The expected result should be something like this:
3010, 3009, 3008, 3007, and so on…
Well, the same query executed on the same database with the same data but running on MariaDB returns a different recordset:
3006, 2008, 3007, 500, and so on…
I was able to solve the problem simply adding and ORDER BY clause to the external subquery, as follow:
SELECT DISTINCT Z.ID
FROM (
SELECT Field1, Field2, Field3....
FROM Table1 ORD
INNER JOIN Table2 OC ON ORD.OrdineCoppiaID = OC.ID
LEFT JOIN Table3 NEG ON OC.NegozioID = NEG.ID
....
WHERE 1=1
ORDER BY OC.ID DESC, ORD.Progressivo) AS Z ORDER BY Z.ID DESC LIMIT 0, 25
) AS T
Why this different beahviour? Who is right between MySql and MariaDB?
I don’t know, but the lesson is clear: if you expect a recordset in a certain order, always explicitly set this in your query, and don’t even trust an inner subquery order by!