MariaDB和MySQL之间的不一致性

MariaDB和MySQL之间的不一致性,mysql,sql,mariadb,Mysql,Sql,Mariadb,我发现在这两个数据库之间如何解释查询有不同的行为,我想知道是否有人能解释这里发生了什么。查询如下所示: 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,

我发现在这两个数据库之间如何解释查询有不同的行为,我想知道是否有人能解释这里发生了什么。查询如下所示:

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;
+-----+----------+
| 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 |
+-----+----------+
+-----+----------+
| 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 |
+-----+----------+
结果如下所示:

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;
+-----+----------+
| 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 |
+-----+----------+
+-----+----------+
| 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 |
+-----+----------+
Oracle 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;
+-----+----------+
| 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 |
+-----+----------+
+-----+----------+
| 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 |
+-----+----------+
Oracle 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 |             |
+----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------------+
我已经找到了解决办法,但我真的很想知道这里发生了什么。有人有什么想法吗

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

谢谢

编辑:评论中指出,在大多数数据库中,查询是无效的SQL,但MySQL可以查询,但数据库可以自由地从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) 

此查询使用的是一个so caledMySql扩展,用于分组方式
有关详细信息,请参阅此链接:

他们明确表示:

MySQL扩展了GROUPBY的使用,以便选择列表可以引用 GROUP BY子句中未命名的未聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序和 分组。但是,这主要是在每个 未在GROUP BY中命名的未聚合列对于每个列都是相同的 小组服务器可以从每个组中自由选择任何值,因此 除非它们相同,否则选择的值是不确定的。


考虑到上述因素,此行为符合规范。

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

groupby
用法本质上是无效的SQL,其他DBMS都会拒绝该查询。那太好了。非常感谢。但是,这里的值并不含糊。我将用更多信息编辑我的OP。