簡體   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