MariaDB vs Mysql查询麻烦

时间:2015-12-03 15:25:07

标签: mysql mariadb

最近我们将我们的数据库系统从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服务器?我疯了。

提前致谢。

2 个答案:

答案 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标准)。也许这有助于你走向正确的方向。

我不知道这个问题的解决方案。