2012-01-10 66 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