mysql如果行不存在,则获取默认值

时间:2011-02-12 12:04:29

标签: php mysql join

我正在为一个系统制作一个偏好模块,这样用户就可以为某些部分定义自己的偏好(如布局,颜色方案,主屏幕等)。表中的每个首选项都有一个默认值(如果用户尚未定义一个),一旦用户更改了首选项,系统应该使用该用户定义的值。

我在选择所需的值时遇到问题,我的查询使用了用户定义的值,但遗憾的是,当用户尚未定义偏好时,它会返回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),如果不存在,则必须返回默认值。

2 个答案:

答案 0 :(得分:1)

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

只是为了清理剩下的查询:

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

如果id的{​​{1}}被命名为preferences,那么长preference_id语句可以替换为ON

USING(preference_id)功能可以替换为IF

答案 1 :(得分: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'"}

这样,您的正确查询将始终位于$ query var中。 希望这有帮助!