【问题标题】:mariadb - LEFT OUTER JOINmariadb - 左外连接
【发布时间】:2015-09-17 23:32:13
【问题描述】:

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

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

所以...,现在,我将 mariadb 作为 DB,它返回不同的输出,其中所有行都被标记为 'obtained' = 1。

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

【问题讨论】:

    标签: mysql sql left-join mariadb


    【解决方案1】:
    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';
    

    好的,又可以了,谢谢。

    【讨论】:

      【解决方案2】:

      我无法说明查询不起作用的原因。这似乎是一个数据问题——所有行都匹配。

      但是,有一个更好的方法来编写查询:

      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 上的适当索引。

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

      【讨论】:

      • IF(obtained IS NULL, 0, 1)
      猜你喜欢
      • 2017-09-28
      • 2011-10-01
      • 2016-10-02
      • 1970-01-01
      • 2011-09-10
      • 2014-02-24
      • 2020-12-17
      • 2019-01-22
      • 2016-10-29
      相关资源
      最近更新 更多