[英]Joining 3 MySQL tables in to 1 query
我有3個表,用於存儲用戶,可用設置和用戶設置。 用戶表具有標准的用戶資料,例如用戶名,密碼,名稱,日期等。設置表具有所有可用系統設置的列表以及默認值,例如:
settingID name defaultValue
----------------------------------------------
1 push notifications 1
2 profile image 0
3 full name 1
4 distance measure Miles
用戶設置表具有用戶設置的任何自定義設置,如下所示:
userSettingID userID settingID customValue
----------------------------------------------------------
1 1 1 0
2 1 3 0
3 1 4 KM
我正在嘗試將所有3個表連接在一起的查詢,但是會從設置表中產生所有結果,如果userSettings表中存在匹配項,請使用customValue,否則請使用設置表中的defaultValue。
所以我想產生以下內容:
userID settingID userSettingID name defaultValue customValue
---------------------------------------------------------------------------
1 1 1 push... 1 0
null 2 null profi.. 0 null
1 3 2 full... 1 0
1 4 3 dista.. Miles KM
如您所見,我想要每一個設置記錄,如果有匹配項,則填充userID和/或customValue,否則填充NULL。
我能夠獲得期望的結果,但是一旦添加WHERE userID = x子句,我就只會獲取已設置用戶的記錄。
謝謝
編輯:到目前為止,我的查詢是:
SELECT *
FROM settings
LEFT OUTER JOIN userSettings ON settings.settingID = userSettings.settingID
LEFT OUTER JOIN user ON userSettings.userID = user.userID
要獲取customValue
而不是defaultValue
如果存在),可以使用coalesce
函數並按userid
進行過濾,您希望將條件添加到customValue
而不是在where子句中使用它(這會使左聯接的行為像是內部聯接)。
我猜你想要這樣的東西:
select
us.userID,
s.settingID,
us.userSettingID,
s.name,
s.defaultValue,
us.customValue,
coalesce(us.customValue, s.defaultvalue) as OverriddenValue
from settings s
left join Usersetting us on s.settingID = us.settingID
left join user u on u.userid = us.userID and u.userID = 1
user
是MySQL中不可保留的關鍵字,因此盡管允許使用不帶引號的標識符,但這並不是標識符的好選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.