【问题标题】:mysql if row doesn't exist, grab default valuemysql 如果行不存在,获取默认值
【发布时间】:2011-06-26 01:32:38
【问题描述】:

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

我在选择所需值时遇到问题,我的查询使用用户定义的值,但遗憾的是,当用户尚未定义首选项时,它会返回 null。

我有两张桌子

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 的首选项),如果不存在,它必须返回默认值。

【问题讨论】:

    标签: php mysql join


    【解决方案1】:

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

    只是为了清理查询的其余部分:

    定义的首选项中的id 不需要存在,而是使用preference_id 和user_id 的组合键。

    如果preferences 的id 被命名为preference_id,那么长的ON 语句可以替换为USING(preference_id)

    IF函数可以替换为COALESCE(defined_value, default_value)

    【讨论】:

    • 谢谢,这正是我想要的!
    【解决方案2】:

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

    所以你会得到:

    $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 变量中。 希望这会有所帮助!

    【讨论】:

    • 谢谢,但我宁愿不做第二步
    猜你喜欢
    • 2023-03-03
    • 2017-08-15
    • 2022-12-15
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多