最近我们将我们的数据库系统从MySql更改为MariaDB,我们在查询时遇到了一些麻烦......
SELECT
(SELECT
IFNULL(label, '') FROM (
SELECT
( SELECT label FROM llx_categorie WHERE rowid = @r And type = 0 ) AS label,
@r As r,
( Select @r := fk_parent FROM llx_categorie WHERE rowid = r And type = 0 ) As parent,
@l := @l - 1 As lvl
FROM( SELECT @r := 732, @l := 5, @cl := 0 ) vars,
llx_categorie h
Where (@l > 0) And type = 0 And @r > 0 And label IS NOT NULL
ORDER BY parent ASC
) as t1
LIMIT 0,1 ) as catlevel1,
(SELECT
IFNULL(label, '') FROM (
SELECT
( SELECT label FROM llx_categorie WHERE rowid = @r And type = 0 ) AS label,
@r As r,
( Select @r := fk_parent FROM llx_categorie WHERE rowid = r And type = 0 ) As parent,
@l := @l - 1 As lvl
FROM( SELECT @r := 732, @l := 5, @cl := 0 ) vars,
llx_categorie h
Where (@l > 0) And type = 0 And @r > 0 And label IS NOT NULL
ORDER BY parent ASC
) as t1
LIMIT 1,1 ) as catlevel2
这只是一个简单的查询,用于从类别id @ r732获取父类别。
如果我们在MySql上运行这个按预期返回,例如。
+----------------------+--------------+
| catlevel1 | catlevel2 |
+----------------------+--------------+
| Todas las categorías | Sonido-Audio |
+----------------------+--------------+
但在MariaDB中返回此内容。
+----------------------+--------------+
| catlevel1 | catlevel2 |
+----------------------+--------------+
| Todas las categorías | NULL |
+----------------------+--------------+
有谁知道怎么可能?或可能的解决方案缺少配置启用o服务器?我疯了。
提前致谢。
答案 0 :(得分:1)
我认为问题源于这样的事情:
给定一个带有ORDER BY
的子查询和一个没有ORDER BY
的外部查询......
在旧MySQL中,内部排序在外部``SERECT`中仍然有效。
在MariaDB中,未指定的外部排序是不可预测的。
可能的解决方案:将ORDER BY parent ASC
移出一个级别。
另一种可能的解决方案(对于MariaDB):设置optimizer_switch ='derived_merge = off'(或者optimizer_switch ='derived_merge = off,derived_with_keys = off',具体取决于表的结构)。 Reference
我怀疑你得到'正确'的catlevel1只是巧合,但不是catlevel2。
另外,如果您不使用它,请删除llx_categorie h
。
答案 1 :(得分:0)
首先,事实并非如此:
这只是一个简单的查询
)
其次,在我对此进行了一些研究之后(我很惊讶),我注意到在查询mySQL或MariaDB时有很多不同的结果,但是大多数它们似乎都连接到ORDER BY
和{ {1}}。 Somebod精心指出,使用SIGNED和UNSIGNED类型,mariaDB更严格(=更符合ANSI标准)。也许这有助于你走向正确的方向。
我不知道这个问题的解决方案。