【问题标题】:MariaDB vs Mysql Query TroubleMariaDB vs Mysql 查询问题
【发布时间】:2015-12-03 15:25:07
【问题描述】:

最近我们将数据库系统从 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         |
+----------------------+--------------+

有人知道这怎么可能吗?或者可能的解决方案?服务器启用缺少配置?我快疯了。

提前致谢。

【问题讨论】:

  • 为什么选择llx_categorie h?我看不到h 的任何用途。删除表格或在适当的字段中添加限定条件,并说明JOIN 是如何完成的。还是“交叉连接”?

标签: mysql mariadb


【解决方案1】:

我认为问题源于这样的事情:

给定一个带有ORDER BY 的子查询和一个没有ORDER BY 的外部查询...

在旧的 MySQL 中,内部排序在外部``SELECT` 中仍然有效。

在 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,请将其删除。

【讨论】:

    【解决方案2】:

    首先,这不是真的:

    这只是一个简单的查询

    ;)

    其次,在我对此进行了一些研究之后(这让我感到惊讶),我注意到在查询 mySQL 或 MariaDB 时有很多不同的结果,但其中大多数似乎连接到 ORDER BYGROUP BY . Somebod 还详细指出,mariaDB 对 SIGNED 和 UNSIGNED 类型更严格(=更符合 ANSI)。也许这可以帮助您走向正确的方向。

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

    【讨论】:

    • 感谢您提供线索,我仍在寻找这些数据库引擎之间的解决方案。 :)
    • 而你却把它当作“答案”??
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2023-03-19
    • 2014-05-16
    • 2017-01-02
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多