我已经意识到我这样做的方式不是最理想的,而且可能永远不会正常工作,现在我正在使用两个表而不是三个表,这似乎有效。
如果您有解决方案,欢迎您回答,但只有在遇到类似问题时才能帮助他人。
我有一个带有uid,名称和基本信息的用户表。我有一个带有sid的设置表,设置的名称和设置的默认值。
我还有一个带有sid,uid和value的users_settings表,将用户的设置链接到设置的名称和用户的名称。
在一个查询中,我如何选择一个用户,并在设置表中“循环”,在users_settings中选择用户的设置(如果存在),或者如果没有,则为每个设置选择该设置的默认值?
最好每个设置都会在结果集中显示为一列(列的名称是设置的名称,值是设置的值)。
如果无法理解,这是一个例子:
用户表:
uid name email
1 Maria maria@example.com
4 George george@example.com
设置表:
sid name default_value
1 uicolour #f00
2 language en
users_settings表:
uid sid value
4 1 #000
1 2 es
针对uid 4的MySQL查询所需的结果:
uid name email setting_colour setting_language
4 George george@example.com #000 en
针对uid 1的MySQL查询所需的结果:
uid name email setting_colour setting_language
1 Maria maria@example.com #f00 es
答案 0 :(得分:0)
好的,在了解了它之后,并了解了有关左连接的更多信息,这似乎有效:
SELECT t_users.*, t_users_settings.*, t_settings.*
FROM t_users
LEFT JOIN t_users_settings ON t_users.uid = t_users_settings.t_uid
LEFT JOIN t_settings ON t_settings.t_sid != t_users_settings.t_sid
WHERE t_users_settings.t_sid IS NOT NULL
AND t_users_settings.t_uid IS NOT NULL
AND t_users.uid = '<input user id here>';