繁体   English   中英

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

[英]mysql if row doesn't exist, grab default value

我正在为系统创建首选项模块,以便用户可以为某些部分(诸如布局,颜色方案,主屏幕等)定义自己的首选项。 表中的每个首选项都有一个默认值(以防用户尚未定义一个默认值),并且一旦用户更改了首选项,系统便应使用该用户定义的值。

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

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)

如果我在哪里,我会做一两个查询。

这样您将获得:

$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变量中。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM