微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MariaDB和MySQL之间的不一致

我发现在这两个数据库之间如何解释查询的行为有所不同,我想知道是否有人可以对这里发生的事情有所了解.查询如下所示:

SELECT t1.id, t2.album_id
FROM t1
    LEFT OUTER JOIN t2
        ON t1.data_id = t2.id
        AND t1.event_type IN (1002, 1001, 1000)
WHERE
    t1.event_type IN (1000, 1001, 1002, 1200, 1201, 1202, 1203)
GROUP BY t1.id
ORDER BY t1.id DESC
LIMIT 0, 20;

MariaDB的结果如下所示:

+-----+----------+
| id  | album_id |
+-----+----------+
| 623 |     NULL |
| 622 |     NULL |
| 621 |     NULL |
| 620 |     NULL |
| 619 |     NULL |
| 618 |     NULL |
| 617 |     NULL |
| 616 |     NULL |
| 615 |     NULL |
| 614 |     NULL |
| 613 |     NULL |
| 612 |      194 |
| 611 |     NULL |
| 610 |     NULL |
| 609 |     NULL |
| 608 |      193 |
| 607 |     NULL |
| 606 |     NULL |
| 605 |     NULL |
| 604 |     NULL |
+-----+----------+

Oracle MySQL结果如下所示:

+-----+----------+
| id  | album_id |
+-----+----------+
| 623 |     NULL |
| 622 |     NULL |
| 621 |     NULL |
| 620 |     NULL |
| 619 |     NULL |
| 618 |     NULL |
| 617 |     NULL |
| 616 |      196 |<-- different
| 615 |     NULL |
| 614 |     NULL |
| 613 |     NULL |
| 612 |      194 |
| 611 |      194 |<-- different
| 610 |     NULL |
| 609 |     NULL |
| 608 |      193 |
| 607 |      193 |<-- different
| 606 |     NULL |
| 605 |     NULL |
| 604 |     NULL |
+-----+----------+

另外,当我解释查询时,我可以看到两个数据库对查询的解释不同. (请参见“其他”列)

玛丽亚数据库

+------+-------------+-------+--------+---------------+---------+---------+------------------------+------+-------------+
| id   | select_type | table | type   | possible_keys | key     | key_len | ref                    | rows | Extra       |
+------+-------------+-------+--------+---------------+---------+---------+------------------------+------+-------------+
|    1 | SIMPLE      | t1    | index  | NULL          | PRIMARY | 4       | NULL                   |   20 | Using where |
|    1 | SIMPLE      | t2    | eq_ref | PRIMARY       | PRIMARY | 4       | foo.t1.data_id         |    1 | Using where |
+------+-------------+-------+--------+---------------+---------+---------+------------------------+------+-------------+

甲骨文MySQL

+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                       | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------------+
|  1 | SIMPLE      | t1    | index  | NULL          | PRIMARY | 4       | NULL                      |   20 | Using where |
|  1 | SIMPLE      | t2    | eq_ref | PRIMARY       | PRIMARY | 4       | foo.t1.data_id            |    1 |             |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------------+

我已经找到解决方法,但是我真的很想知道这里发生了什么.有人有什么想法吗?

如果您想自己尝试,可以找到我在本示例中使用的数据转储here.

谢谢.

编辑:在注释中已指出,该查询在大多数数据库中是无效的SQL,但在MySQL allows中是有效的-但该数据库可以自由地从GROUP BY返回任何聚合值.我想指出的是,这里出现的情况有所不同,因为这些值并不明确.只有一个匹配行,但与MariaDB返回的值不对应.

SELECT t1.id, t2.album_id
FROM t1
    JOIN t2
        ON t1.data_id = t2.id
WHERE
    t1.id = 616
; 

+-----+----------+
| id  | album_id |
+-----+----------+
| 616 |      196 |
+-----+----------+
1 row in set (0.00 sec) 

解决方法:

事实证明,这实际上是MariaDB中的bug,当在2个条件下使用group by和left join时,可能会产生错误的结果.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐