从DB获取应用程序级别和全局级别设置

时间:2018-02-15 15:07:28

标签: mysql

我正在构建一个动态应用程序,它将根据设置进行操作。

设置存储在MySQL表中,该表由应用级数据和全局级数据(app_id = 0)组成。

我的用例是,我想选择应用程序的设置。如果它不存在,则从全局级别获取相应的设置。

我使用子查询和COALESCE函数实现了这一点。

问题:可以在单个查询中获取数据吗?如果没有,是否可以修改架构以更简单的方式处理此应用程序级别和全局级别?

模式

CREATE TABLE `settings` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `partner_id` int(11) NOT NULL,
    `app_id` int(11) DEFAULT NULL,
    `type` varchar(64) DEFAULT NULL,
    `name` varchar(64) DEFAULT NULL,
    `value` varchar(300) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `key_partner_id` (`partner_id`),
    KEY `key_app_id` (`app_id`),
    KEY `key_type` (`type`),
    KEY `key_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据

| id | partner_id | app_id |  type |    name |  value |
|----|------------|--------|-------|---------|--------|
|  1 |        500 |      0 | color | primary |   blue |
|  2 |        500 |    100 | color | primary |  green |
|  3 |        500 |    101 | color | primary |    red |

查询

SELECT * FROM settings WHERE app_id in (
  COALESCE ((SELECT app_id FROM settings WHERE app_id = 100), 0)
);

| id | partner_id | app_id |  type |    name | value |
|----|------------|--------|-------|---------|-------|
|  2 |        500 |    100 | color | primary | green |


SELECT * FROM settings WHERE app_id in (
  COALESCE ((SELECT app_id FROM settings WHERE app_id = 102), 0)
);

| id | partner_id | app_id |  type |    name | value |
|----|------------|--------|-------|---------|-------|
|  1 |        500 |      0 | color | primary |  blue |

1 个答案:

答案 0 :(得分:0)

单个查询以获取应用的设置或回退到全局设置

SELECT * FROM settings 
WHERE app_id IN(0,102)
ORDER BY app_id DESC
LIMIT 1;

显然,这假设应用设置只有一行。