簡體   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