mariadb - 左外连接

mariadb - LEFT OUTER JOIN

最近迁移了一个服务器,我发现了这个 "error",我有 mysql 作为数据库,以及我想要的(我不是 SQL 方面的专家), 是通过 1:N 加入 2 个相关的 tables,例如

Table 1: Badges_Person
Table 2: Badges

Badges 是带有徽章的 table,而 Badges_Person 包含类似 (id_badge, id_person) 的关系,简单吧? 那么这个 SQL 查询似乎总是工作正常:

SELECT id, nombre, descripcion, insignias.time, obtained
FROM insignias LEFT OUTER JOIN 
     (SELECT *, '1' as obtained
      FROM insignias_user
      WHERE insignias_user.username = 'Octal'
    ) as insignias_user_seleccionado
    ON insignias.id = insignias_user_seleccionado.id_insignia;

此查询的输出是带有 'obtained' 列(0 或 1)的徽章列表,表示用户 'Octal' 是否拥有该徽章。

所以...,现在,我将 mariadb 作为数据库,它 returns 一个不同的输出,其中所有行都标记为 'obtained' = 1.

我来到这里是因为据我所知,我已经排除了所有愚蠢的可能错误。

我无法解释为什么查询不起作用。这似乎是一个数据问题——所有行都匹配。

但是,有更好的方式来编写查询:

SELECT i.id, i.nombre, i.descripcion, i.time, ius.obtained
FROM insignias i LEFT OUTER JOIN 
     insignias_user iu
    ON i.id = ius.id_insignia AND ius.username = 'Octal';

这样效率更高,因为中间 table 不需要具体化,数据库可以利用 insgnias_user.

上的适当索引

另请注意:我将列引用更改为合格的列名。 table 别名可能不正确。

SELECT i.id, i.nombre, i.descripcion, i.time, IF(ius.id_insignia IS NULL, 0, 1)
FROM insignias i LEFT OUTER JOIN insignias_user ius
ON i.id = ius.id_insignia AND ius.username = 'Octal';

好的,又成功了,谢谢