2012-01-10 65 views
0

我有三個表...用戶,user_info和quota_levels。他們是這樣的:如果條目不存在,選擇默認值

CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(31) NOT NULL, 
    password VARCHAR(33) NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE user_info (
    userID INT UNSIGNED NOT NULL, 
    firstName VARCHAR(32), 
    lastName VARCHAR(32), 
    phone CHAR(14), 
    address VARCHAR(128), 
    birthdate DATE, 
    misc TEXT, 
    quotaLevel VARCHAR(32), 
    PRIMARY KEY (userID) 
); 

CREATE TABLE quota_levels (
    quotaLevel VARCHAR(32) NOT NULL, 
    quota1 INT NOT NULL, 
    quota2 INT NOT NULL, 
    PRIMARY KEY (level) 
); 

每個用戶都將擁有users表中的條目,但不一定在user_info表。 user_info表中的每個用戶都有一個quotaLevel,對應於quota_levels表中的quotaLevel列。 quotaLevel的可能值是BRONZE,SILVER,GOLD和PLATINUM。

我可以進一步解釋爲什麼這樣設置,但只是說這個結構不能改變會更快。

如果用戶存在,我想要得到他們的quotaLevelquota1的值。如果用戶不存在,則應返回BRONZE的值quota1

我想用ONE查詢。它可以做,如何?

+0

downvote的任何好理由,還是隻是隨機點擊的人? – Travesty3 2012-03-05 19:28:02

回答

2
SELECT u.Name, 
     COALESCE(ql.quota1, (SELECT quota1 FROM quota_level WHERE quotaLevel = 'BRONZE')) 
    FROM users u 
     LEFT JOIN user_info ui 
      INNER JOIN quota_level ql 
       ON ui.quotaLevel = ql.quotaLevel    
      ON u.id = ui.userID 
+0

我沒有什麼字符串'BRONZE'回來了,我想要'quota_levels'裏的'quota1'值'quotaLevel' = BRONZE。 – Travesty3 2012-01-11 13:20:41

+0

看起來這對你來說是一個很好的起點。整個問題不一定就是給你答案,而是你回答它的工具。 – Stainedart 2012-01-11 13:30:03

+0

@ Travesty3:好的,然後硬編碼該值而不是單詞'BRONZE'。 – 2012-01-11 13:30:20