繁体   English   中英

mariadb-左外联接

[英]mariadb - LEFT OUTER JOIN

最近迁移了服务器,我发现了这个“错误”,我将mysql作为数据库,而我想要的(我不是SQL方面的专家)是通过1:N连接2个相关的表,例,

Table 1: Badges_Person
Table 2: Badges

徽章是带有徽章的表,并且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;

该查询的输出是带有“获得”列(0或1)的徽章列表,该列表明用户“八度”是否具有该徽章。

所以...,现在,我将mariadb作为数据库,它返回一个不同的输出,其中所有行都标记为“获得” = 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';

这是非常有效的,因为不需要实现中间表,并且数据库可以使用insgnias_user上的适当索引。

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

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';

好的,它再次起作用,谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM