我有三个表...用户,用户信息和配额级别。他们看起来像这样:

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表中的每个用户都有一个quotaLevelquotaLevel表中quota_levels列相对应。 quotaLevel的可能值为BRONZE,SILVER,GOLD和PLATINUM。

我可以详细解释为什么要这样设置,但是说这种结构不能更改会更快。

如果用户存在,我想获取其quota1quotaLevel值。如果用户不存在,则应返回BRONZE的quota1值。

我想用一个查询做到这一点。能做到吗?如何做到?

最佳答案

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

08-28 06:54