【发布时间】:2012-07-06 17:00:07
【问题描述】:
更新:
我已经意识到我这样做的方式不是最理想的,并且永远无法正常工作,现在我使用两个表而不是三个,这似乎可行。
如果您有解决方案,欢迎您回答,但如果其他人遇到类似问题,则只能帮助他们。
我有一个包含 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
【问题讨论】:
-
好吧,我尝试过 LEFT 和 INNER JOIN,但我能得到的只是设置(如果存在)。我想不出任何将默认设置合并到结果中的方法。我认为,我需要在查询中进行某种循环和测试。我想我可以让注册表单将值放入并弃用 default_value。但它会复制大量数据。
-
我的意思是,你能把你尝试过的查询添加到你的答案中吗,你可能很接近,只需要调整一下。
-
我尝试过的唯一代码是设置表中的设置名称,因此它不会关闭。我没有在设置、user_settings 和 users 表之间进行任何双左连接。我可以向你保证,我不知道该怎么做:P
-
那不是好的数据库设计。如果添加更多设置,则必须向用户表中添加更多列。
-
在下面查看我的答案 - 请注意,这适用于您的原始架构,这是一个更好的设计。