【问题标题】:Challenge: MySQL users table default settings挑战:MySQL 用户表默认设置
【发布时间】: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
  • 那不是好的数据库设计。如果添加更多设置,则必须向用户表中添加更多列。
  • 在下面查看我的答案 - 请注意,这适用于您的原始架构,这是一个更好的设计。

标签: mysql default


【解决方案1】:

好的,在使用它进行 gank 并了解有关左连接的更多信息之后,这似乎可行:

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>';

【讨论】:

  • 虽然,如果您将更多设置添加到设置表中,您最终会得到更多记录。我不知道比添加更多连接更好的构造查询的方法,但这比在数据库中添加更多列更好。如果有人有更好的查询,我将不胜感激,因为这对我来说也是一个学习的东西。
  • 在我看来,系统并不是为此而设计的。如果它这么难 / hacky,那么可能有更好的方法来构建数据。
  • 我认为数据结构很好,你有一个默认设置、自定义设置和用户表。它的设置方式是您可以添加更多默认值而无需重组表。我只是对 sql 还不够好,还不知道如何构造查询以在一组中获取所有结果。我想我会在代码审查上发布这个查询(因为它有效),看看他们怎么说。
  • 哦,我可能还会考虑更改您的列名。 NAME 和 VALUE 是 mysql 中的保留字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2018-02-18
  • 1970-01-01
  • 2012-09-07
  • 2021-07-02
  • 2019-04-14
相关资源
最近更新 更多