Mysql

如何加入不為空

  • December 29, 2017

我正在嘗試創建推薦系統。我通過在每次註冊期間將所有推薦人(第一、第二和第三“階段”)傳入數據庫來做到這一點。

澄清一下,如果使用者 ID 3 從 ref 註冊。使用者 ID 2,並且使用者 ID 2 是從 ID 1 的 ref 註冊的,使用者 ID 3 的值如下所示:

`r1` = 2, `r2` = 1, `r3` = NULL

要從使用帶有整個路徑的某個 id 的 ref 連結註冊的數據庫中讀取,我想出了這個查詢:

SELECT `sub`.`id` AS first,`sub2`.`id` AS `second`,`sub3`.`id` AS `third`

FROM `users` AS `usr` 

JOIN `users` AS `sub` ON `sub`.`r1` = `usr`.`id` 
JOIN `users` AS `sub2` ON `sub2`.`r2` = `usr`.`id` 
JOIN `users` AS `sub3` ON `sub3`.`r3` = `usr`.`id`

WHERE `usr`.`id` = :CurrentUserId ;

(:CurrentUserId 是 PHP 的 PDO 佔位符,用於 int 值)

雖然,它有問題,因為它僅適用於所有 3 都指向過去的帳戶,因此只有第一行或第一和第二行但沒有第三行的人將不會被列出。換句話說,這意味著,如果有使用者,則具有以下值

r1 = 2, r2 = 1, r3 = NULL

未列出。如果 r3 等於某個值,它就可以工作。

我可以通過向數據庫發送 3 個查詢來解決它,但我確信,有更好的方法。

(我對數據庫不是很熟悉)

使用左連接而不是內連接,這樣即使 r1、r2 和 r3 是,來自使用者的記錄仍然會顯示null

SELECT sub.id AS first,sub2.id AS second,sub3.id AS third

FROM users AS usr

LEFT JOIN users AS sub ON sub.r1 = usr.id 
LEFT JOIN users AS sub2 ON sub2.r2 = usr.id
LEFT JOIN users AS sub3 ON sub3.r3 = usr.id

WHERE usr.id = :CurrentUserId ;

但是,根據您的範例,我認為您可能需要以下查詢,更改連接條件,以便 sub、sub2 和 sub3 代表被推薦的使用者:

SELECT sub.id AS first,sub2.id AS second,sub3.id AS third

FROM users AS usr

LEFT JOIN users AS sub ON sub.id = usr.r1
LEFT JOIN users AS sub2 ON sub2.id = usr.r2
LEFT JOIN users AS sub3 ON sub3.id = usr.r3

WHERE usr.id = :CurrentUserId ;

引用自:https://dba.stackexchange.com/questions/192706