Mysql
如何加入不為空
我正在嘗試創建推薦系統。我通過在每次註冊期間將所有推薦人(第一、第二和第三“階段”)傳入數據庫來做到這一點。
澄清一下,如果使用者 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 ;