mysql - mariadb - 左外连接

标签 mysql sql left-join mariadb

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

Table 1: Badges_Person
Table 2: Badges

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)的徽章列表,该列表示用户“Octal”是否拥有该徽章。

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

这样的效率要高得多,因为不需要具体化中间表,并且数据库可以利用 insgnias_user 上的适当索引。

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

关于mysql - mariadb - 左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31150652/

相关文章:

salesforce - 如何在 Salesforce 中进行左内连接

PHP - mysqldump 不起作用

javascript - 在node.js中显示javascript对象内容

mysql - UNION 会导致 MyIsam 上的表锁定吗?

sql - 在 SQL 中向临时表添加日期列

sql - 识别 SQL 中的重复数据组

sql - 使用Intellisense开发MySQL存储过程?

sql - 如果 PostgreSQL 中存在另一个表,如何使用 IF 语句删除 1 个表

sql - 如何根据连接属性的最接近值左连接两个表?

linq-to-sql - Linq 到 SQL : Left joining a grouped set makes a Cross Apply/Outer Apply