2012-07-06 51 views
0

UPDATE:

因为我已经意识到我的方式在做,这是最理想的,可能永远都工作正常,而现在使用的是两个表,而不是三个,这似乎工作。挑战:MySQL用户表的默认设置

欢迎您回答如果您有解决方案,但只有在他们遇到类似问题时才能帮助他人。


我有一个与uid,名称和基本信息的用户表。我有一个设置表与sid,设置的名称和设置的默认值。

我还有一个users_settings表,其中包含sid,uid和value,将用户设置链接到设置名称和用户名称。

在一个查询中,我将如何选择一个用户,并通过设置表“循环”,选择user_settings中的用户设置(如果存在),或者该设置的默认值(如果不存在),对于每个设置?

最好每个设置都将作为列出现在结果集中(列的名称是设置的名称,值是设置的值)。

在那不知所云的情况下,这里有一个例子:

用户表:

uid name email 
1 Maria [email protected] 
4 George [email protected] 

设置表:

sid name  default_value 
1 uicolour #f00 
2 language en 

users_settings表:

uid sid value 
4 1 #000 
1 2 es 

德从MySQL查询结果首创的UID 4:

uid name email    setting_colour setting_language 
4 George [email protected] #000   en 
从MySQL查询UID 1

期望的结果:

uid name email    setting_colour setting_language 
1 Maria [email protected] #f00   es 

谢谢! :)

+1

你尝试过什么码? – JohnP 2012-07-06 17:02:46

+0

嗯,我已经试过左和内部联接,但我能得到的是设置,如果它存在。我想不出有什么办法可以将默认设置合并到结果中。我想在查询中需要一些循环和测试。 我想我可以让注册表单将值放入并弃用default_value。它会重复大量的数据。 – felamaslen 2012-07-06 17:03:31

+0

我的意思是,你可以将你试过的查询添加到你的答案中,你可能会很近,只需要调整。 – JohnP 2012-07-06 17:05:20

回答

0

好吧,ganking与它周围,以及有关左学习更多的连接,这似乎工作后:

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

虽然如果您向设置表中添加更多设置,您将获得更多记录。我不知道更好的方式来构建查询,而不是添加更多的连接,但是这比在数据库中添加更多列更好。如果任何人有更好的查询,我会很感激纠正,因为这对我来说也是一个学习的东西。 – JohnP 2012-07-06 18:43:09

+0

在我看来,系统并不是为此而设计的。如果这很难/很难,那么可能有更好的方法来构造数据。 – felamaslen 2012-07-06 19:57:11

+0

我认为数据结构很好,你有一个默认设置,自定义设置和用户表。它的设置方式可以添加更多的默认值,而无需重组表格。我只是不够好,但尚未知道如何构建查询以获得所有结果。我想我会发布这个查询(因为它的工作原理)在代码审查,看看他们说什么。 – JohnP 2012-07-06 20:03:18