2011-02-12 106 views
1

我正在为系统制作首选项模块,以便用户可以为某些部分(例如布局,颜色方案,主屏幕等)定义他们自己的首选项。表中的每个首选项都有一个默认值(如果用户尚未定义),并且一旦用户更改了其首选项,系统应该使用该用户定义的值。mysql如果行不存在,则获取默认值

我在选择所需的值时遇到了问题,我的查询与用户定义的值一起工作,但遗憾的是,当用户还没有定义偏好时,它会返回null

我有2个表

table **preferences**: 
id 
name 
default_value 

table **preferences_defined**: 
id 
preference_id 
user_id 
defined_value 

我想创建一个功能可轻松通过给予人的USER_ID选择所需的值给谁优先适用和首选项的名称。此刻我的查询看起来是这样的:

SELECT IF(ISNULL(defined_value),default_value,defined_value) AS result 
FROM preferences 
LEFT JOIN preferences_defined ON preferences_defined.id = preferences.id 
WHERE user_id = 17 
AND name = "menu_items" 

我猜WHERE user_id = 17部分是哪里出了问题,因为当没有可用的定义值,这意味着目前也没有一个叫user_id列。 我需要找到一种方法来完成这项工作。 所以,我需要选择定义的值(如果存在的话)(如果不存在,给定user_idname),否则它将不得不返回默认值。

回答

1

WHERE (user_id = 17 OR user_id IS NULL) AND name = "menu_items"

而只是为了清理其余查询:

id定义并不需要在那里,使用preference_iduser_id,而不是组合密钥偏好。

如果preferencesid被评为preference_id,长ON语句可与USING(preference_id)

取代的IF功能可与COALESCE(defined_value, default_value)

+0

谢谢你,那真是我寻找的东西! – Pieter888 2011-02-12 13:51:01

0

被替换如果我在那里你,我会做一个/两个查询。

所以,你会得到:

$query = "SELECT * FROM preferences_defined WHERE user_id = 17 AND name = 'menu_items'" 

然后在PHP:

$rows = mysql_num_rows($query); 
if($rows == 0){ 
$query = "SELECT * FROM preferences WHERE name = 'menu_items'"} 

这样你的右手查询将始终处于$查询变种。 希望这有助于!

+0

谢谢,但我宁愿不做第二步 – Pieter888 2011-02-12 13:51:35