2011-02-12 49 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

相關問題