我不確定這是否真的得到你的問題,但我認爲這是一個有趣的小數據庫練習。假設你有一個名爲「設置」的表,你在#1建議:
+------------+--------------+-----------+---------------+
| setting_id | setting_name | is_system | setting_value |
+------------+--------------+-----------+---------------+
| 3 | foo | 1 | Blue |
| 4 | foo | 0 | Red |
| 5 | bar | 1 | Green |
| 6 | baz | 1 | Yellow |
| 7 | baz | 0 | Orange |
| 8 | quux | 0 | Purple |
+------------+--------------+-----------+---------------+
的主鍵將是對setting_id
和唯一約束應用於列setting_name
和is_system
(這是布爾值)。
要查找所有的當前活動(假設用戶設置覆蓋系統設置)的設置,下面的查詢將做的工作:
SELECT setting_name, setting_value
FROM setting s
WHERE is_system = (
SELECT MIN(is_system)
FROM setting si
WHERE s.setting_name = si.setting_name
);
運行查詢產生這樣的結果:
+--------------+---------------+
| setting_name | setting_value |
+--------------+---------------+
| foo | Red |
| bar | Green |
| baz | Orange |
| quux | Purple |
+--------------+---------------+
因此,如果存在用戶設置,則會提取它,否則將使用系統默認值。
以這種方式使用MIN()
函數是對布爾值操作的一種反常方式,但它很簡單。
什麼是「系統用戶設置」?你的意思是默認的用戶設置? – 2009-03-05 09:30:12