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';
好的,又成功了,谢谢
最近迁移了一个服务器,我发现了这个 "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';
好的,又成功了,谢谢