2021/03/15

Mysql JOIN

 工作上需要,我有兩個表格,其中一個叫 logger, 一個叫 terminals

logger 很單純,會記錄各種 log, 其中一個欄位會記錄來自哪個 terminal mac, 如果它是 terminal 造成的錯誤。

問題在於,terminals 表格是直式的,就是它的欄位像 attribute, value 這樣的型式,譬如

id    attribute          value

1     mac                123456789012

1     name               t1

2     mac                234567890123

2     name               t2

如果想在列出 logger 時,對這類 log 印出這條 log 來自哪個 terminal 該怎麼辦?

對mariadb 而言,因為要的是 logger, 所以要用 LEFT JOIN

LEFT JOIN 的意思是,我要表格左邊的結果,但是在某些條件下合併表格資料

所以就像 SELECT l.id,l.date,l.info,IF(l.mac<>'',t2.name,'') as termname FROM logger AS l
 LEFT JOIN Terminals AS t1 on
   t1.attribute='mac' AND l.mac<>'' AND l.mac=t1.value
     LEFT JOIN Terminals AS t2 on
       t1.id=t2.id AND t2.attribute='name'

翻譯成中文大概就像:
我要全部的 logger 資料,其中
   如果 mac 欄位有值,那就從 Terminals 表格查,其 attribute='mac' 其值為 mac
   但是傳回 Terminals 中相同 id 的 terminal 名稱


有點複雜,我也是想很久才清楚,可以這麼說,LEFT JOIN 是以左邊的(LEFT) 語法為結果,加上條件來自(JOIN) 後面的限制

0 意見: